[JAVA] 백준 4673 셀프 넘버

그린·2024년 3월 4일
0

PS

목록 보기
4/17

1) 문제

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

2) 문제 접근

실은 1년 전에 풀어봤던 문제였긴 한데,,
기억은 안 났다,,

그냥 브루트포스로 일일이 돌면서 파악하는 방법밖에 생각해내지 못했는데
풀고나서 예전 풀이랑 다른 분 풀이를 찾아보니 맞는 방법이긴 했다.

나는 numbers라는 0 ~ 10001 크기의 boolean 배열을 선언했다.
numbers는

  • 셀프넘버가 아닌 경우 : true
  • 셀프넘버인 경우 : false
    로 담기도록 의도했다.

1 ~ 10000 번 인덱스에 대해 다 돌면서
해당 인덱스 값 n에 대해 d(n) 을 구한 후
d(n)이 10000보다 작으면
셀프넘버가 아닌 10000보다 작은 수 이므로, numbers[d(n)] = true 로 넣어줬다.

이때 d(n)을 구하기 위해,
39 -> 39 + 3 + 9 = 51 이 되어야 하는 만큼

  • next_num(51이 되고자 하는 변수)와
  • temp_num(39에서 3, 9 이렇게 한 자리 수만 가져오기 위한 변수)을

활용해서 d(n)을 구했다.

3) 풀이 1

메모리: 14512 KB, 시간: 156 ms

이리저리 수정해가면서 정답이 나온 코드인데, 살짝 지저분하다..

public class Main {
    public static void main(String[] args) {
        boolean[] numbers = new boolean[10001];
        for (int i = 1; i <= 10000; i++) {
            int next_num = i;
            int temp_num = next_num;
            while (temp_num >= 10) {
                next_num += temp_num % 10;
                temp_num /= 10;
            }
            next_num += temp_num % 10;
            if (next_num <= 10000) {
                numbers[next_num] = true;
            }
        }

        for (int i = 1; i <= 10000; i++) {
            if (!numbers[i]) {
                System.out.println(i);
            }
        }
    }
}

3-2) 풀이 2

위의 코드가 별로 깔끔하지 않아서
다른 분의 코드를 조금 참고해서 수정해보았다.
https://st-lab.tistory.com/53

바뀐 점은,
while 문의 조건을 더 깔끔하게 했다는 점과,,

            while (temp_num != 0) {
                next_num += temp_num % 10;
                temp_num /= 10;
            }

StringBuilder sb = new StringBuilder(); 를 활용해서 더 빠르게 출력할 수 있도록 했다!

public class Main {
    public static void main(String[] args) {
        boolean[] numbers = new boolean[10001];
        for (int i = 1; i <= 10000; i++) {
            int next_num = i;
            int temp_num = next_num;
            while (temp_num != 0) {
                next_num += temp_num % 10;
                temp_num /= 10;
            }
            if (next_num <= 10000) {
                numbers[next_num] = true;
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= 10000; i++) {
            if (!numbers[i]) {
                sb.append(i).append("\n");
            }
        }
        System.out.println(sb);
    }
}

4) 느낀 점

그동안 프로젝트만 하다가 오랜만에 알고리즘 문제를 다시 풀었는데 확실히 머리가 굳은 게 느껴졌다..
다시 열심히 풀면서 머리를 말랑말랑하게 해줘야겠다.. (말랑말랑 두뇌교실..? 죄송합니다,,)

그리고 이번부터 인텔리제이의 자동완성 기능을 끄고 풀었더니 확실히 느낌이 달랐다..!!
앞으로 계속 끄고 꾸준히 풀어봐야겠다. 파이팅!!

profile
기록하자

0개의 댓글

관련 채용 정보