●문제 : 자연수 N의 가장 작은 생성자를 구하는 프로그램
● 풀이
자연수 N이 주어졌을 때, 1부터 N까지 모든 수의 분해합을 구해보면서, 가장 작은 생성자를 구해야 하므로, 첫 분해합이 자연수와 같으면 그 수를 출력한다.
첫 번째 풀이
위를 생각하며 10의 자리 일 때, 100의 자리 일 때 분해합을 구하는 코드를 쓰다가 생각해보니 입력 조건이 "첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다." 이다..
그럼 이건 실패.
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int cs = in.nextInt();
int n = 0;
for (int i = 0; i <= cs; i++) {
if(i<10){
n = i;
}else if (i < 100){
n = i + (i/10) + (i%10);
}
}
}
}
두 번째 풀이
받는 수의 길이에 상관없이 각 자리수를 더하는 식의 코드를 구현하기.
오류가 난다.
문제점 : while(i != 0) { ~ } 식에서 i를 가져와 수정하였는데, 외부 루프의 제어 변수를 변경하는 것은 문제가 되므로, 새로운 변수에 복사하여 사용해야 한다! 중요
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int cs = in.nextInt();
int n = 0, result = 0;
for (int i = 0; i <= cs; i++) {
while (i != 0) {
n += i % 10;
i /= 10;
}
if(n + i == cs){
result = i;
break;
}
}
System.out.println(result);
}
}
● 최종 풀이
i를 직접 가져와 수정하지 않고 새로운 임시 변수를 만들어 계산하였다.
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int cs = in.nextInt();
int result = 0;
for (int i = 0; i < cs; i++) {
int n = 0;
int temp = i;
while (temp != 0) {
n += temp % 10;
temp /= 10;
}
if (n + i == cs) {
result = i;
break;
}
}
System.out.println(result);
}
}
최종 정리 : 외부 루프의 제어 변수를 루프 내에서 변경하는 것은 문제가 된다.
새로운 변수에 복사하여 값을 변경하여야 한다!!
'백준' 카테고리의 다른 글
[백준] 2798 블랙잭_ JAVA (0) | 2023.06.03 |
---|---|
[백준] 2292 벌집_ JAVA (0) | 2023.06.03 |
[백준] 1978 소수 찾기_ JAVA (0) | 2023.06.03 |
[백준] 10250 ACM 호텔_ JAVA (1) | 2023.06.03 |
[백준] 1085 직사각형에서 탈출_ JAVA (0) | 2023.06.02 |