1 minute read



문제 풀이


이번 문제는 단순한 구현 문제로 문제가 요구하는 내용을 잘 파악한다면 쉽게 풀 수 있다.


아이디어 도출

문제 풀이를 위한 생각한 아이디어는 다음과 같다.

  1. 0부터 9까지의 원소의 빈도수를 카운팅하기 위해 카운팅 배열을 이용한다.
  2. 주어진 방 번호대로 0부터 9까지 빈도수를 센 후, 6과 9는 뒤집어서 쓸 수 있기 때문에 같은 수로 취급한다.
    2.1 6과 9의 카운트의 합이 짝수이면 6과 9의 빈도수를 각각 반으로 나눠주고, 홀수라면 반으로 나눠준 뒤, 한번 더 사용해야 하기 때문에 1씩 증가시킨다.
  3. 카운팅 배열에 원소 중 가장 많은 빈도수가 필요한 세트 수가 된다.
  4. 오름차순/내림차순 정렬 후 최대값 인덱스 접근이나 반복문을 돌며 최대값을 찾는 방법으로 배열의 최대값을 구하면 된다.


문제 풀이를 위해 작성한 코드는 아래와 같다.

작성코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.*;
import java.util.*;

class Main {    

    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        // 카운팅 배열을 사용한다.
        int[] arr = new int[10];
        int result = 0;

        String N = br.readLine();

        for(int i=0; i<N.length(); i++) {
            int num = Character.getNumericValue(N.charAt(i));
            arr[num]++;            
        }

        /**
         * 6과 9의 경우 바꿔서 사용할 수 있다.
         * 그래서 6과 9의 빈도수를 함께 계산한다.
         * - 짝수라면 각각 반씩 나눈다.
         * - 홀수라면 반씩 나눈 후 1씩을 추가한다.(반씩 나누어도 한 번 더 사용해야 하기 때문)
         */
        int temp = arr[6] + arr[9];
        
        if(temp % 2 ==0) {
            arr[6] = temp / 2;
            arr[9] = temp / 2;
        } else {
            arr[6] = (temp / 2) + 1;
            arr[9] = (temp / 2) + 1;
        }
        
        // 필요한 세트 수는 배열의 최댓값이기에 arr 배열을 오름차순 정렬한다.
        Arrays.sort(arr);
        
        // 배열의 마지막 원소가 필요한 세트 수가 된다.
        result = arr[9];

        bw.write(result+"\n");

        bw.close();
        br.close();
    }    

}

출처


  • 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.