문제 url:
분해합
문제:
자연수 N을 입력받으면, 자연수 N이 되기 위한 분해합을 출력받는 문제이다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int sum = 0;
for (int i =1; i<N; i++) {
sum = i + ( i / 1000000) + ((i % 1000000) / 100000) + (((i % 1000000) % 100000) / 10000)
+ ((((i % 1000000) % 100000) % 10000) / 1000)
+ (((((i % 1000000) % 100000) % 10000) % 1000) / 100) + ((((((i % 1000000) % 100000) % 10000) % 1000) % 100) / 10)
+ ((((((i % 1000000) % 100000) % 10000) % 1000) % 100) % 10) ;
if(sum == N) {
System.out.println(i);
break;
}
}
if (sum != N) {
System.out.println(0);
}
}
}
코드 리팩토링 시간에 코드 분석을 하고자 하여, 전체 로직만 간단하게 설명하고자 한다.
위에서 설명했듯, 자연수 N의 분해합을 구하기 위해 N보다 작은 모든 값들을 계산한다. 이는 for문을 이용해서 풀 수 있다.
sum은 분해합의 값을 넣을 변수로 분해합은 자연수 M과 M의 각 자리수의 합으로 이루어져 있다.
해당 코드는 굉장히 하드하게 짜서 어지러운데, 말로 설명을 하면
조건에서 N은 1,000,000 이하라고 했기 때문에 1,000,000 자리부터 1자리까지 계산한 로직이다.
이렇게 짜면 답은 맞게 나오지만, 망한다.. 공부를 위해서는 코드 리팩토링을 참고
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int result = 0;
for (int i = 1; i < N; i++) {
int number = i;
int sum = 0;
while(number != 0) {
// number(i)의 1의 자리를 구할 수 있다.
sum += number % 10;
// 10을 나눔으로 이전에 구했던 일의 자리는 절삭.
number /= 10;
}
if(sum + i == N) {
result += i;
break;
}
}
System.out.println(result);
}
}
각 자리수를 나누는 방법을 계산하지 못해 저렇게 하드 코딩식으로 했는데..
알고나니 충분히 생각할 수 있던 로직이었다
아직 경험이 부족하다고 생각하며 위안을 가지지만, 이러한 로직을 보면 볼수록 많은 생각을 하며 문제를 풀어 나가야겠다는 생각이 든다.