https://www.acmicpc.net/problem/20164
20164번: 홀수 홀릭 호석
호석이는 짝수랑 홀수 중에서 이니셜이 같은 홀수를 더 좋아한다. 운전을 하던 호석이는 앞차의 번호판이 홀수로 가득할 때 사랑스러움을 느낄 정도이다. 전화번호도 홀수만 있고 싶다. 그렇게
www.acmicpc.net
풀이
위 문제는 다음과 같은 연산을 반복한다.
- 입력받은 숫자 -> 홀수 개수 카운트
- 숫자를 짜름 -> 짜른 각각의 숫자를 모두 더한 숫자 -> 홀수 개수 카운트한 다음 이전 카운트에 더함
숫자의 홀수 개수를 카운트한 다음 이전 카운트에 더하는 로직이 반복되므로, 재귀호출 또는 반복문을 사용해야 한다. 또한 만들 수 있는 모든 경우의 수를 구해 그중 최솟값과 최댓값을 구해야 한다.
즉, 재귀호출을 사용하며 모든 경우의 수를 구할 수 있는 DFS를 사용하였다.
DFS를 사용하여 모든 경우의 수를 구하기 때문에, 최솟값과 최댓값은 static 전역 변수에 따로 저장하도록 했다.
private static int min = Integer.MAX_VALUE;
private static int max = Integer.MIN_VALUE;
먼저 입력받은 문자를 숫자로 변환한 후 cutNumber()를 호출해 DFS를 시작한다.
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
cutNumber(n, 0);
System.out.println(min + " " + max);
}
void cutNumber(int n, int cnt): 숫자 n으로 문제의 연산을 수행한다. DFS를 사용하여 모든 경우의 수를 구한다.
private static void cutNumber(int n, int cnt) {
cnt += countOddNumber(n);
if (n / 10 == 0) {
min = Integer.min(min, cnt);
max = Integer.max(max, cnt);
}
else if (n / 100 == 0) {
int next = n / 10;
next += n % 10;
cutNumber(next, cnt);
}
else {
String str = String.valueOf(n);
for (int i = 0; i < str.length() - 2; i++) {
for (int j = i+1; j < str.length() - 1; j++) {
int next = Integer.parseInt(str.substring(0, i+1));
next += Integer.parseInt(str.substring(i+1, j+1));
next += Integer.parseInt(str.substring(j+1));
cutNumber(next, cnt);
}
}
}
}
countOddNumber()를 수행하여 숫자 n에서 홀수의 개수를 찾는다.
그 다음 수가 한 자리인 경우, 두 자리인 경우, 세 자리인 경우에 따라 다르게 처리한다.
한 자리인 경우 최종값을 구했으므로 min과 max 값을 각각 업데이트한다.
두 자리인 경우 2개로 나눠서 합을 구하여 새로운 수를 구하고 cutNumber()를 호출한다.
세 자리인 경우 이중 for문을 사용하여 끊을 수 있는 모든 임의의 위치에 대해 3개의 수로 분할하고, 3개를 더한 값을 새로운 수를 구한 다음 cutNumber()를 호출한다.
int countOddNumber(int n): 숫자 n에 포함된 홀수의 개수를 구한다.
private static int countOddNumber(int n) {
int cnt = 0;
while (n > 0) {
int tmp = n % 10;
if (tmp % 2 == 1) {
cnt++;
}
n /= 10;
}
return cnt;
}
전체 코드
import java.io.*;
public class Main {
private static int min = Integer.MAX_VALUE;
private static int max = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
cutNumber(n, 0);
System.out.println(min + " " + max);
}
private static void cutNumber(int n, int cnt) {
cnt += countOddNumber(n);
if (n / 10 == 0) {
min = Integer.min(min, cnt);
max = Integer.max(max, cnt);
}
else if (n / 100 == 0) {
int next = n / 10;
next += n % 10;
cutNumber(next, cnt);
}
else {
String str = String.valueOf(n);
for (int i = 0; i < str.length() - 2; i++) {
for (int j = i+1; j < str.length() - 1; j++) {
int next = Integer.parseInt(str.substring(0, i+1));
next += Integer.parseInt(str.substring(i+1, j+1));
next += Integer.parseInt(str.substring(j+1));
cutNumber(next, cnt);
}
}
}
}
private static int countOddNumber(int n) {
int cnt = 0;
while (n > 0) {
int tmp = n % 10;
if (tmp % 2 == 1) {
cnt++;
}
n /= 10;
}
return cnt;
}
}
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 21608번 : 상어 초등학교 - 자바[Java] (0) | 2023.03.17 |
---|---|
[백준] 14719번 : 빗물 - 자바[Java] (0) | 2023.03.16 |
[백준] 3190번 : 뱀 - 자바[Java] (0) | 2022.12.16 |
[백준] 5639번 : 이진 검색 트리 - 자바[Java] (0) | 2022.11.21 |
[백준] 1991번 : 트리 순회 - 자바[Java] (0) | 2022.11.20 |