본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1475 방 번호

by 까망 하르방 2021. 2. 17.
반응형

출처: https://www.acmicpc.net/problem/1475 

 Input 
126961

 Output 

2

0~9까지 숫자 세트를 받았을 때, 주어지는 방 번호 N을 표시하고자 한다.

6 과 9는 서로 뒤집어서 이용가능하기 때문에 대체될 수 있다.

 

- 동일한 숫자가 중복해서 나타나면 그에 따른 숫자 세트 '지급'이 필요하다. 

- 6, 9가 서로 대체될 수 있기 때문에 이에 대한 처리만 주의한다.


import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) throws Exception {    
        Scanner sc = new Scanner(System.in);
         
        // 숫자를 문자열로 입력 받는다.
        // 0 <= 1,000,000
        String str = sc.next();
         
        // 옆집에서 주는 숫자 세트를 배열형태로 표현
        // 0~9 (여기서 주의할 점은 '6'과 '9'는 거꾸로 뒤집어 동일하게 표시할 수 있기에 예외적으로 처리할 예정)
        int[] arr = new int[10];
        // 초기에 한세트는 필요하므로 1로 할당
        int answer = 1;
        for(int i=0; i<arr.length; i++) {
            arr[i] = 1;
        }
         
         
        // 앞에서 부터 주어진 숫자세트를 추가해야 할지 판단한다.
        for(int i=0; i<str.length(); i++) {
             
            // 입력받은 문자열에서 한개씩 들고온다.
            int target = Integer.parseInt(str.substring(i, i+1));
            //System.out.println("target: " + target);
            // '6' 혹은 '9'의 경우에는 별도의 case로 처리
            if(target == 6 || target == 9) {
                // 두 숫자 모두 남은 카드가 없다면 새롭게 세트를 받아야 한다.
                if(arr[6] <= 0 && arr[9] <= 0) {
                    // 세트를 받았으므로 모둔 숫자의 값이 증가하고
                    answer++;
                    //System.out.println("6,9 숫자 부족 세트 재지급: " + answer);
                    for(int j=0; j<arr.length; j++) {
                        arr[j]++;
                    }
                    // 그 중 '6'의 숫자를 사용해 배치하겠다.
                    arr[6]--;
                }else { // 6 이나 9 중에 아직 사용할 수 있는 카드가 있다는 상태
                    if(arr[6] >= 1) {
                        //System.out.println("6 사용");
                        arr[6]--;
                    }else { // '6'이 없으므로 9로 처리
                        //System.out.println("9 사용");
                        arr[9]--;
                    }
                }
            }else { // '6'과 '9'가 아닌 다른 숫자.
                // 만약 해당 숫자의 여분이 없다면 세트를 새로 지급
                if(arr[target] <= 0) {
                    answer++;
                    //System.out.println("세트 재지급: " + answer);
                    for(int j=0; j<arr.length; j++) {
                        arr[j]++;
                    }
                }
                // 리필된 것이든 아니든 해당 카드 사용
                //System.out.println(target + " 사용");
                arr[target]--;
                 
            }
        }
        // 정답 출력
        System.out.println(answer);
    }
}

반응형

댓글