Contents
https://www.acmicpc.net/problem/1475
다솜이가 자신의 방 번호를 문 앞에 붙이기 위해 필요한 플라스틱 숫자 세트가 몇개나 필요한지 출력하는 문제.
여기서 숫자는 6, 9가 공용으로 사용된다.
테스트코드 9999 입력 시
6, 9가 공용으로 사용된다.
다시 말해 한 세트에 9가 두개인 셈
두 세트만으로 충분하다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 방 번호
// 0 ~ 9까지 있는 플라스틱 숫자 세트를 번호로 표현하기 위해서 몇 개나 필요한지 반환
// ex) 6은 6, 9로 사용 가능
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
// 숫자 카운터. 6, 9는 6번째 배열을 공용으로 사용
// 0, 1, 2, 3, 4, 5, 6, 7, 8
int[] number_cnt = { 1, 1, 1, 1, 1, 1, 2, 1, 1 };
// 숫자세트 초기 1개
int set = 1;
for (int i = 0; i < str.length(); i++) {
// 해당하는 숫자 카운터 제거
if (str.charAt(i) == '6' || str.charAt(i) == '9') {
number_cnt[6]--;
} else {
number_cnt[Character.getNumericValue(str.charAt(i))]--;
}
// 아스키 코드로 나오기 때문에 Character 클래스의 getNumbericValue 함수 사용
// -48로 대체 가능
int tmp = (Character.getNumericValue(str.charAt(i)) == 9) ? 6 : Character.getNumericValue(str.charAt(i));
// 다 쓰면 한 세트 추가
if (number_cnt[tmp] < 0) {
set++;
for (int j = 0; j < number_cnt.length; j++) {
if (j == 6)
number_cnt[j] += 2;
else
number_cnt[j]++;
}
}
}
System.out.println(set);
}
}
각 숫자별 카운터 배열을 선언해서 사용할 때마다 1씩 감소하게 했다.
9는 6번째 배열과 공용으로 사용해서
초기값은 {1, 1, 1, 1, 1, 1, 2, 1, 1}로 해주었다.
만약에 0 미만인 배열이 발생하게 되면
set를 증가하게 하고 각 배열에 1씩 추가해주었다.
여기서 6번째 배열은 2씩 추가해주었다.
각 자릿수에 대한 배열에 접근하기 위해 문자를 정수로 변환해주려 했는데
아스키코드 번호로 나와서 당황했다.
해결하기 위한 두가지 방법이 있다.
1. 아스키 코드에서 -48
정수에 해당하는 아스키 코드는 다음과 같다
48(0) ~ 57(0)
따라서 해당 정수에서 48을 빼주면 정수를 얻을 수 있다.
2. Character 클래스의 getNumbericValue 함수 사용
'백준' 카테고리의 다른 글
[백준] 문자열 집합 (JAVA) (0) | 2025.02.03 |
---|---|
[백준] 이친수 (JAVA) (3) | 2025.02.03 |
[백준] 보물 (JAVA) (2) | 2025.02.01 |
[백준] 요세푸스 문제 0 (JAVA) (2) | 2025.02.01 |
[백준] 수 찾기(1920) (JAVA) (3) | 2023.07.27 |