본문 바로가기
Algorithm

백준알고리즘 1475번 방 번호

by jayden-lee 2019. 4. 22.
728x90

1475번 방 번호 문제는 문자열 처리 알고리즘입니다.

 

방 번호 4자리 숫자를 입력 받아서 최소 숫자 세트를 이용하여 표현해야 한다. 문제에서 6과 9은 혼용되어서 사용할 수 있다고 했다. 숫자 세트에는 0부터 9까지의 숫자가 들어 있다.

 

예제 입력으로 9999 방 번호 숫자가 들어오면, 숫자 세트는 최소 2개를 사용한다. 9는 6으로도 표현할 수 있으므로 숫자 세트 2개에 있는 6, 9, 6, 9 숫자를 이용한다.

 

6과 9를 혼용해서 사용하므로 처음 입력 받을 때 6 문자열을 모두 9로 변경할 수 있다.

 

만약, 예제 입력으로 6666이 들어오면 9999로 변경될 수 있다. 문자열 변경을 하고 나서 toCharArray() 메서드를 이용하여 각 숫자별 개수가 몇 개 있는지 체크한다.

int index = 0;
for (char ch : roomNumber.toCharArray()) {
    index = (int) ch - 48;

    // 숫자 사용 횟수를 증가시킨다.
    number[index] += 1;
}

 

number 배열 인덱스에 위치하는 값은 숫자를 사용한 카운트 값을 의미한다. 예를 들어, number[0] 값이 2 이면, 방 번호 숫자에 0이 2번 나왔다는 것이다.

 

number[9] 값은 6과 9 두 개의 숫자를 카운트한 값이므로 2로 나누어 줘야 한다.

for (int i = 0; i < 10; i++) {
    // 숫자 9의 경우 6과 함께 카운트가 되었으므로 2로 나누어서 반올림한다.
    if (i == 9) {
        useCount = (int) Math.round(number[9] / 2.0);
    } else {
        useCount = number[i];
    }

    if (useCount > maxUseCount) {
        maxUseCount = useCount;
    }
}

 

마지막으로 각 숫자별 카운트 값 중 가장 큰 값이 최소 숫자 세트를 의미한다.

import java.util.Scanner;

/**
 * 방 번호 문제<br>
 * 알고리즘 분류 : 문자열 처리
 * 
 * @author jayden-lee
 */
public class Main {

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

        // 각 숫자별(0~9) 사용한 횟수를 저장하는 배열을 생성한다.
        int[] number = new int[10];

        String roomNumber = scanner.next();

        // 6과 9는 혼용되어서 사용할 수 있으므로
        // 6을 9로 값을 변경한다.
        roomNumber = roomNumber.replace('6', '9');

        int index;
        for (char ch : roomNumber.toCharArray()) {
            index = (int) ch - 48;

            // 숫자 사용 횟수를 증가시킨다.
            number[index] += 1;
        }

        int maxUseCount = -1;
        int useCount = 0;

        for (int i = 0; i < 10; i++) {
            // 숫자 9의 경우 6과 함께 카운트가 되었으므로 2로 나누어서 반올림한다.
            if (i == 9) {
                useCount = (int) Math.round(number[9] / 2.0);
            } else {
                useCount = number[i];
            }

            if (useCount > maxUseCount) {
                maxUseCount = useCount;
            }
        }

        System.out.println(maxUseCount);

        scanner.close();
    }
}

 

댓글