[Java] 백준 4673번: 셀프 넘버

U·2023년 2월 20일

백준

목록 보기
8/116

💻 문제


일단 이해하자🤔

  • n이 생성자인 d(n)은 n이 한 자리 수일때는 n + n, 두 자리 수일때는 n + (n / 10) + (n % 10)과 같이 반복이 된다. 자리 수에 따른 index 값을 구한 뒤 생성되는 수의 자리에 0을 넣도록 했다.
  • 처음엔 문제를 어떻게 해결해야 될지 도저히 모르겠어서 다른 문제들을 먼저 풀며 로직을 생각해보았다. 근데 결국 위에 적은 것처럼 1부터 10000 사이에 있는 셀프 넘버들은 생성자가 없는, 즉 생성자로 생성되지 않는 수 아닌가? 그래서 1부터 10000까지 수가 들어있는 배열을 생성하고 생성자가 있는 수들은 0을 넣은 뒤 0이 아닌 값들만 출력하도록 했다. 이때, index는 10000을 넘으면 안되므로 조건을 설정해준다.

👀 풀이

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(System.out));
        int[] arr = new int[10001];
        arr[0] = 0;

        for (int i = 1; i <= 10000; i++) {
            arr[i] = i;
        }

        for (int i = 1; i <= 10000; i++) {
            int index = 0;

            if (i > 0 && i < 10) {
                index = i + i;
                if (index <= 1000) {
                    arr[index] = 0;
                }
            }

            else if (i >= 10 && i < 100) {
                index = i + (i / 10) + (i % 10);
                if (index <= 10000) {
                    arr[index] = 0;
                }
            }

            else if (i >= 100 && i < 1000) {
                index = i + (i / 100) + (i % 100 / 10) + (i % 100 % 10);
                if (index <= 10000) {
                    arr[index] = 0;
                }
            }

            else if (i >= 1000 && i <= 10000) {
                index = i + (i / 1000) + (i % 1000 / 100) + (i % 1000 % 100 / 10) + (i % 1000 % 100 % 10);
                if (index <= 10000) {
                    arr[index] = 0;
                }
            }
        }

        for (int i = 1; i <= 10000; i++) {
            if (arr[i] != 0) {
                bfw.write(String.valueOf(arr[i] + "\n"));
            }
        }

        bfw.flush();
        bfw.close();
    }
}

아쉬웠던 점••

  • 만약 주어진 숫자의 범위가 10000까지가 아니라 더 큰 수라면 if-else문이 불필요하게 길어진다. 1부터 10000까지 for문을 돌리기 때문에 이중 for문을 쓰는 것은 실행 속도를 늦출까봐 사용하지 않았는데 다른 사람들의 코드를 참고해보니 그렇지 않은 것 같다. for문을 이용해서도 구현해보자.
  • 며칠동안 풀지 못했던 문제를 생각의 전환으로 구현해낸게 뿌듯하다😊
  • 조금 더 간단하고 깔끔하게 구현할 수도 있었을까?
profile
백엔드 개발자 연습생

0개의 댓글