4657 : 셀프 넘버

oh_eol·2024년 4월 2일
0

BaekJoon

목록 보기
1/1
post-thumbnail

문제


링크 : https://www.acmicpc.net/problem/4673


해결

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static int solution(int num) {
        // 자기 자신 더하기
        int sum = num;
        // 자릿수 더하기
        while (num != 0) {
            sum += num % 10;
            num /= 10;
        }
        // 생성자가 있는 수를 반환
        return sum;
    }

    public static void main(String[] args) throws IOException {
        // 불린은 기본적으로 false로 초기화 됨.
        // 따라서 1~10000 까지의 숫자 num 을 solution에 넣고, num으로 만들어지는 생성자를 반환받아 10001 보다 작을 경우 해당 인덱스를 모두 true 로 만듦.
        boolean[] constNums = new boolean[10001];
        constNums[0] = true;

        for (int i = 1; i < 10001; i++) {
            int n = solution(i);
            if(n < 10001) {
                constNums[n] = true;
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10001; i++) {
            if(!constNums[i]) sb.append(i).append('\n');
        }

        System.out.println(sb);
    }
}

main()

  • constNums[] 배열은 생성자가 있는 수에 해당하는 index를 true로 저장한다. 따라서 구하고자 하는 셀프 넘버에 해당하는 인덱스는 false 이다.

solution()

  • main 에서 넘겨준 생성자 num 으로 만들어지는, 생성자가 있는 수 sum 을 구하여 반환한다.
  • sum 에는 우선 num 을 더하고, 반복문을 통해 num 의 각 자릿수를 더해서 구한다.

공부한 것

StringBuilder

  • 호출 회수를 줄이기 위해 System.out.println() 을 반복문 바깥으로 빼자.

숫자 num의 각 자릿수 구하기(더하기)

  • num % 10 : 나머지 연산을 이용해 일의 자릿수부터 차례로 구한다.
  • num / 10 : 몫의 연산으로 num의 자릿수를 줄여가고, while(num != 0) 으로 num이 남지 않으면 멈춘다.
profile
공부 중입니다.

0개의 댓글