숫자가 주어질 때 아래와 같은 연산을 구한다.
숫자의 홀수의 개수를 센 이후 저장한다.
한 자리 수인 경우 : 함수 종료
두 자리 수인 경우 : 십의 자리와 일의 자리로 나눈 이후 합을 구해 1과정으로 돌아감
세 자리 수인 경우 : 임의의 위치에서 끊어 3개의 수로 분할하여 합을 구해 1과정으로 돌아감
함수가 종료되면, 저장된 숫자를 모두 더한다.
임의의 수 N이 주어지고 위와 같은 연산을 수행할 때 홀수 개수 합의 최솟값과 최댓값을 구하는 문제이다
연산을 보면 눈에 띄는 말이 있다. "1 과정으로 돌아간다"
특정 과정을 반복적으로 수행해야 하는 함수, 바로 재귀 함수를 통해 해결하면 될 것이다.
input으로 주어진 숫자에 홀수 개수가 몇 개인지를 구하고, 숫자를 쪼갠 이후 재귀함수를 통해 쪼갠 수의 합을 인자로 넘겨주면 해결될 것이다.
import java.io.*;
import java.util.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static int N;
static int min = Integer.MAX_VALUE;
static int max = Integer.MIN_VALUE;
static int now(int x) { // x의 홀수 개수를 구하는 함수
int result = 0;
while(x>0) {
int check = x %10;
if(check%2==1) result++;
x /= 10;
}
return result;
}
static void cut(int param, int count) {
// param : 재귀함수의 인자로 넘어올 수.
// 즉, 연산 약속에 의해 쪼갤 숫자
// count : param을 만드는 과정까지 count한 홀수 개수 + param 홀수 개수
if(param<10) {
// 1자리 수. 연산을 종료하므로 max와 min값 설정
min = Math.min(min, count);
max = Math.max(max, count);
}
else if(param<100) {
/*
2자리 수. 10의 자리 숫자와 1의 자리 숫자를 더해준다.
여기서 중요한점! cut의 count는 param의 홀수 개수를 더해준 값을 넘겨줘야 함
next를 다음 재귀 함수의 param으로 넘겨주기 위해서는,
다음 재귀 함수의 count에는 next 수의 홀수 개수를 더한 이후
결과값을 넘겨줘야 할 것이다
즉, now(next)를 통해 next의 홀수 개수를 구한 이후 더한 값을
Parameter로 넘겨준다.
*/
int next = (param/10) + (param%10);
cut(next, count + now(next));
}
else {
/*
3자리 수. 임의로 끊어 3자리 수를 만든다.
Int 형으로 Math.pow()의 나머지와 몫을 통해 해결할 수도 있지만,
너무 복잡해진다.
따라서 String형으로 바꾼 다음 substring을 통해 부분 문자열 3개를 만들어
숫자로 변환한 값을 더해준다.
*/
String s = Integer.toString(param);
for(int i =0;i<s.length()-2;i++) {
for(int j =i+1;j<s.length()-1;j++) {
String x1 = s.substring(0,i+1);
String x2 = s.substring(i+1, j+1);
String x3 = s.substring(j+1, s.length());
int next = Integer.parseInt(x1)+Integer.parseInt(x2)
+Integer.parseInt(x3);
cut(next, count + now(next));
}
}
}
}
public static void main(String[] args) {
FastReader sc = new FastReader();
N = sc.nextInt();
cut(N,now(N));
System.out.println(min+" "+max);
}
static class FastReader // 빠른 입력을 위한 클래스
}
3번째 줄 틀렸습니다 : Int형을 Math.pow()로 처리하려고 했는데, 틀렸다. 내가 생성했던 랜덤 케이스에서는 잘 나눠줬던 것 같은데, 어디선가 분할을 잘못해 주는 것 같다. int와 String의 변환을 통한 문제 해결법은 가장 먼저 생각했지만, 변환하는데 시간이 걸릴 것 같아 사용하지 않았다. 하지만, 문제를 틀린 것을 보고 시간이 조금 더 걸리더라도 확실한 방법을 선택하기로 했다. 코테에서도 일단 맞추는 것이 중요하니 확실한 방법으로 먼저 푼 이후 최적화 방법을 고안하도록 하자
2번째 줄 틀렸습니다 : 2자리 수일 때 next(now) 값을 더해줘야 하는데 실수로 next(param) 값을 더해주어 틀렸다.