[백준] 2231번 : 분해합 - Java(자바)

2025. 7. 5. 23:50·코테

문제


풀이


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
'코테' 카테고리의 다른 글
  • [백준] 10989번 : 수 정렬하기 - Java(자바)(카운팅 정렬)
  • [백준] 24313번 : 알고리즘 수업 - 점근적 표기 1 -Java(자바)
  • [백준] 24267번 : 알고리즘 수업 - 알고리즘의 수행 시간 6 - 자바(JAVA)
  • [백준] 2588번 : 곱셈 - JS(자바스크립트)
eun_log
eun_log
  • eun_log
    개발은
    eun_log
  • 전체
    오늘
    어제
    • 분류 전체보기 (75)
      • 코테 (17)
      • CS (6)
        • 자료구조, 알고리즘 (3)
        • 네트워크 (0)
        • 데이터베이스 (2)
        • 운영체제 (0)
      • frontend (32)
        • JavaScript (29)
        • html&css (1)
        • project_study (2)
      • backend (15)
        • Java (15)
      • project (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
eun_log
[백준] 2231번 : 분해합 - Java(자바)
상단으로

티스토리툴바