문제

풀이
1은 생성자가 없기 때문에(분해합은 무조건 2부터 시작이다.) 그래서 2부터 N까지 반복문을 통해 해당 숫자의 분해합을 구해 N과 같고 가장 작은 생성자를 구한다.
1) 첫번째 시도
N이 1인 경우에는 생성자가 없기 때문에 N==1이면 0을 출력하게 하였다.
int N = Integer.parseInt(br.readLine());
int min = N;
if(N==1){ //생성자 없는 경우
bw.write("0");
}else{
for(int i=2;i<N;i++){
String[] iarr = (i+"").split(""); //i 각 자리수로 나누기
int sum = i;
for(int j=0;j<iarr.length;j++){
sum+=Integer.parseInt(iarr[j]);
}
if(N==sum&&i<min){
min=i;
}
}
}
if(min==N){//생성자 없는 경우
bw.write("0");
}else{
bw.write(min+"");
}
bw.close();
하지만 98%에서 틀렸고 코드를 분석해본 결과 우선 코드 과정이 N이 1이 아닐때, 생성자가 없는 경우 0을 출력하도록 하였는데, N=1인 경우에도 min=N이기 때문에 따로 나누지 않아도 된다. 그리고 N이 1일때 첫번째 if문에서 0을 출력하고 다시 아래의 if(min==N)에서 또다시 0이 출력되기 때문에 2번 출력된다. 그래서 if(N=1)을 삭제해주었더니 맞았다.
2) 두번째 코드
int N = Integer.parseInt(br.readLine());
int min = N;
for(int i=2;i<N;i++){
String[] iarr = (i+"").split(""); //i 각 자리수로 나누기
int sum = i;
for(int j=0;j<iarr.length;j++){
sum+=Integer.parseInt(iarr[j]);
}
if(N==sum&&i<min){
min=i;
}
}
if(min==N){//생성자 없는 경우
bw.write("0");
}else{
bw.write(min+"");
}
bw.close();
3)최종 코드
좀 더 간결한 방법이 있을까 싶어서 다른 분들의 코드를 봤더니 min을 사용하지 않아도 되는 이유를 알게 되었다.
반복문에서 이미 작은값 순서대로 생성자를 찾고있기 때문에 sum과 N이 같은 순간에 반복문을 빠져나오면 된다.
int N = Integer.parseInt(br.readLine());
int result = 0;
for(int i=2;i<N;i++){
String[] iarr = (i+"").split(""); //i 각 자리수로 나누기
int sum = i;
for(int j=0;j<iarr.length;j++){
sum+=Integer.parseInt(iarr[j]);
}
if(N==sum){
result=i;
break;
}
}
bw.write(result+"");
bw.close();
정리
코드를 생각의 흐름대로 짜는 것보다 N=1일때 값이 두번 출력되는 것과 반복문에서 이미 작은 값 순서로 찾고 있다는 것처럼 꼼꼼하게 생각하며 코드를 짜는 연습을 많이 해야겠다.
'코테' 카테고리의 다른 글
| [백준] 10989번 : 수 정렬하기 - Java(자바)(카운팅 정렬) (0) | 2025.07.06 |
|---|---|
| [백준] 24313번 : 알고리즘 수업 - 점근적 표기 1 -Java(자바) (2) | 2025.06.30 |
| [백준] 24267번 : 알고리즘 수업 - 알고리즘의 수행 시간 6 - 자바(JAVA) (0) | 2025.06.29 |
| [백준] 2588번 : 곱셈 - JS(자바스크립트) (0) | 2025.05.11 |
| [백준] 2480번 : 주사위 세개 - Java(자바) (2) | 2025.05.04 |