반응형

문제

문자열을 입력으로 주면 문자열의 첫 글자와 마지막 글자를 출력하는 프로그램을 작성하시오.


입력

입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 한 줄에 하나의 문자열이 주어진다. 문자열은 알파벳 A~Z 대문자로 이루어지며 알파벳 사이에 공백은 없으며 문자열의 길이는 1000보다 작다.


출력

각 테스트 케이스에 대해서 주어진 문자열의 첫 글자와 마지막 글자를 연속하여 출력한다.


입출력 예제

입력 출력
3
ACDKJFOWIEGHE
O
AB
AE
OO
AB

풀이

 

-> 간단한 문제이지만 생각해보고 넘어갈 부분이 있어서 기록을 남긴다. 처음 입력 받은 숫자만큼 문자열을 받고 해당 문자열의 첫번째 문자와 마지막 문자를 +해서 출력하면 된다고 생각했다. 하지만 +로 문자를 더하면 문자의 유니코드 값이 더해지기 때문에 유니코드 값이 출력된다. 따라서 문자를 더해서 문자열로 받고 싶다면 중간에 빈 문자열 ""을 더해주면 된다. 


코드

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        sc.nextLine();
        
        String[] word = new String[count];
        for(int i=0;i<count;i++){
            word[i]=sc.nextLine();
            int n = word[i].length();
            System.out.println(word[i].charAt(0) +""+ word[i].charAt(n-1));
        }        
        
    }
}
반응형
반응형

문제

단어 S와 정수 가 주어졌을 때, 번째 글자를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 영어 소문자와 대문자로만 이루어진 단어 가 주어진다. 단어의 길이는 최대 1000이다.

둘째 줄에 정수 가 주어진다. (1≤i≤|)


출력

번째 글자를 출력한다.


입출력 예제

입력 출력
Sprout
3
r
shiftpsh
6
p
Baekjoon
4
k

풀이

 

-> String 문자열의 n번째 순서의 문자는 charAt(n-1)을 통해서 구할 수 있다.


코드

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String word = sc.nextLine();
        int n = sc.nextInt();
        System.out.println(word.charAt(n-1));
    }
}
반응형
반응형

문제

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.


입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.


출력

출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.


예제

입력 출력

3
1
4
5
7
9
6
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

2
8
9
30
6
12
10
20
21
11
7
5
28
4
18
29
17
19
27
13
16
26
14
23
22
15
3
1
24
25
2
8

 


풀이

 

-> 크기가 30인 배열을 만들어 둔 후, 28개의 숫자를 자기자신의 -1인 index를 가지는 배열의 값으로 둔다. 그러면 30개의 배열값 중에서 2개는 값이 0인 상태가 된다. 반복문을 통해서 배열의 값이 0이면 해당 index값에 +1을 해서 출력한다.


코드

 

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int[] array = new int [30];
        
        for(int i=0;i<28;i++){
            int number = sc.nextInt();
            array[number-1] = number;
        }
        
        for(int i=0; i<30; i++){
            if(array[i]==0){
                System.out.println((i+1) + " ");
            }
        }
        
        
    }
}
반응형
반응형

문제

준원이는 저번 주에 살면서 처음으로 코스트코를 가 봤다. 정말 멋졌다. 그런데, 몇 개 담지도 않았는데 수상하게 높은 금액이 나오는 것이다! 준원이는 영수증을 보면서 정확하게 계산된 것이 맞는지 확인해보려 한다.

영수증에 적힌,

  • 구매한 각 물건의 가격과 개수
  • 구매한 물건들의 총 금액

을 보고, 구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하는지 검사해보자.


입력

첫째 줄에는 영수증에 적힌 총 금액 X가 주어진다.

둘째 줄에는 영수증에 적힌 구매한 물건의 종류의 수 N이 주어진다.

이후 N개의 줄에는 각 물건의 가격 a와 개수 b가 공백을 사이에 두고 주어진다.


출력

구매한 물건의 가격과 개수로 계산한 총 금액이 영수증에 적힌 총 금액과 일치하면 Yes를 출력한다. 일치하지 않는다면 No를 출력한다.


제한

  •  1≤X≤1000000000
  •  1≤N≤100
  •  1≤a≤1000000
  •  1≤b≤10

예제 입력

예제입력 예제출력
260000
4
20000 5
30000 2
10000 6
5000 8
Yes
250000
4
20000 5
30000 2
10000 6
5000 8
No

풀이 및 코드

-> 간단한 문제라고 생각했는데도 틀렸다고 나와서 당황했다. 알고보니 Yes, No로 출력하지않고 yes, no라고 출력해서 틀린 것이었다. 주어진 조건을 놓치지 않는 연습이 더 필요해 보인다.

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int totalPrice = Integer.parseInt(sc.nextLine()); // 총 금액
        int totalCount = Integer.parseInt(sc.nextLine()); // 총 구매종류 갯수
        
        int[] price = new int[totalCount]; // 가격 담을 변수
        int[] count = new int[totalCount]; // 갯수 담을 변수
        String judge = "No"; // 금액이 맞는지 아닌지 판단
        int sumPrice = 0;
        
        // 물건 가격과 갯수 담기
        for(int i=0;i<totalCount;i++){
            String totalTemp = sc.nextLine();
            String[] temp = totalTemp.split(" ");
            price[i] = Integer.parseInt(temp[0]);
            count[i] = Integer.parseInt(temp[1]);
            sumPrice += price[i]*count[i];
        }
        
        if(sumPrice==totalPrice){
            judge = "Yes";
        }
        
        System.out.println(judge);
        
    }
}

 

변수를 줄이고, 간결하게 리팩토링한 코드는 아래와 같다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int totalPrice = sc.nextInt(); // 총 금액
        int totalCount = sc.nextInt(); // 총 구매종류 갯수
        sc.nextLine(); // 개행문자 처리
        
        int sumPrice = 0;
        
        // 물건 가격과 갯수 계산
        for (int i = 0; i < totalCount; i++) {
            int itemPrice = sc.nextInt();
            int itemCount = sc.nextInt();
            sumPrice += itemPrice * itemCount;
        }
        
        System.out.println(sumPrice == totalPrice ? "Yes" : "No");
    }
}
반응형
반응형

문제

 

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

  1. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
  2. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
  3. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.

예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.


입력

 

첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.


출력

 

첫째 줄에 게임의 상금을 출력 한다.


예제

 

예제입력 예제출력
3 3 6 1300
2 2 2 12000
6 2 5 600

풀이 및 코드

 

-> 나는 if문으로 모든 경우를 다 따져서 풀었다.(3개가 같은 경우, 2개만 같은 경우, 모두 다른 경우) 그 코드는 아래와 같다.

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

        int a = in.nextInt();
        int b = in.nextInt();
        int c = in.nextInt();
        
        if(a==b&&b==c){
            System.out.println(10000+a*1000);
        } else if((a==b&&b!=c)||(b==c&&c!=a)||(c==a&&a!=b)){
            if(a==b){
                System.out.println(1000+a*100);
            } else if(b==c){
                System.out.println(1000+b*100);
            } else if(c==a){
                System.out.println(1000+c*100);
            }
        } else if(a!=b&&b!=c) {
            if(a>b&&a>c){
                System.out.println(100*a);
            } else if(b>a&&b>c){
                System.out.println(100*b);
            } else if(c>a&&c>b){
                System.out.println(100*c);
            }
        }
        
    }
}

 

하지만 이는 너무 비효율적이어 보인다. 그래서 어떻게 하면 효율적으로 풀 수 있을지 찾아보았다.

Array 함수를 통해서 주사위 값을 미리 정렬한 후에 비교를 하면 크기에 따른 순서가 정해지기 때문에 훨씬 간단하게 코드를 작성할 수 있었다. 그 코드는 아래와 같다.

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] dice = new int[3];
        for (int i = 0; i < 3; i++) {
            dice[i] = in.nextInt();
        }
        Arrays.sort(dice); // 정렬하여 최대 값을 찾기 쉽게 함
        if (dice[0] == dice[2]) { // 모든 주사위 눈이 같은 경우
            System.out.println(10000 + dice[0] * 1000);
        } else if (dice[0] == dice[1] || dice[1] == dice[2]) { // 두 개의 주사위 눈이 같은 경우
            System.out.println(1000 + dice[1] * 100);
        } else { // 모든 주사위 눈이 다른 경우
            System.out.println(dice[2] * 100); // 정렬된 배열의 마지막 요소가 최대 값
        }
    }
}
반응형

+ Recent posts