Algorithm & Data Structure/문제풀이

[Algorithm] 백준 4673(BOJ 4673) 셀프 넘버 문제풀이 (Java)

coding-knowjam(코딩노잼) 2021. 8. 10.
728x90

안녕하세요 Coding-Knowjam입니다.

백준 온라인 저지에 있는 4673번 셀프 넘버 문제를 풀어보겠습니다.

문제에 대한 링크는 아래에 있으니 문제를 먼저 읽고 와주시길 바랍니다.

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

 

1. 문제 설명

문제에서 요구하는 바는 10000까지의 숫자 중 셀프 넘버를 출력하는 것입니다.

셀프 넘버는 문제에서 알려준 대로 생성자가 없는 숫자입니다.

배열의 인덱스를 각각의 숫자로 사용해서 구하면 쉽게 구할 수 있습니다.

딱히 어려운 부분은 없으므로 바로 코드로 작성해보겠습니다.

 

2. Java로 문제 풀이

package study.blog.codingnojam.algorithm.boj;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class BOJ_4673 {

    // 백준온라인저지 4673 셀프 넘버 문제풀이 Java
    public static void main(String[] args) throws IOException {

        // 출력을 위한 객체
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 0 인덱스 사용안할려고 10001로 길이 줌
        boolean[] arr = new boolean[10001];

        // 0은 셀프넘버가 아님
        arr[0] = true;

        // 배열 길이만큼 반복 1부터 시작
        for (int i = 1; i < arr.length; i++) {

            // d(n)의 값을 저장할 변수
            int result = i;

            // 각 자리수마다 숫자를 뽑기위해 문자열 배열로 변환
            String[] str = String.valueOf(i).split("");

            // 문자열 배열의 각 원소는 자리수이므로 하나씩 result에 더 해줌
            for (String s : str) {
                result = result + Integer.parseInt(s);
            }

            // 더한 값이 10000보다 작거나 같은 경우
            if (result <= 10000) {
                // i는 result의 생성자이므로 result는 셀프넘버가 아님
                // 배열의 값이 true면 셀프넘버가 아니라는 뜻
                arr[result] = true;
            }
        }

        // 배열길이 만큼 반복
        for (int i = 0; i < arr.length; i++) {
            // 배열의 각 원소값이 false면 셀프넘버임
            if (!arr[i]) {
                // 출력문에 저장
                bw.write(String.valueOf(i));
                bw.newLine();
            }
        }
        // 출력
        bw.flush();
    }
}

 

작성한 코드의 라인마다 주석을 달아놓았습니다.

주석과 코드를 같이 살펴보시면 이해하는데 크게 어렵지 않으실 겁니다.

감사합니다.


728x90

댓글