2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[백준 셀프넘버 - 4673] 자바 Java [브루트 포스 알고리즘]

2023. 10. 6. 00:54ㆍ백준 알고리즘/브루트 포스(완전 탐색)

 

 

 

 

[잘못한거나 햇갈린 점 ?]

 

구현은 되게 쉬운데 문제를 제대로 이해를 못해서 조금 고민을 했습니다.

그래서 이 문제가 무엇을 묻는건지 찾고 나니 의외로 구현은 정말 간단 했습니다.]

 

 

[해설 및 풀이]

 

이 문제의 경우는 입력값은 없고 10000의 숫자 안에서 셀프 넘버를 찾는 문제입니다.

 

즉 쉽게 생각해서

 

예제를 한번 봅시다.

 

1은 셀프넘버 입니다.

 

1 + 1은 = 2가 됩니다.

 

즉 각자리의 한자리 수 + 자기 자신을 더한 값이 나오면 이 값은 셀프넘버가 아닙니다.

 

즉 1 + 1 = 2가 나오기 때문에 2는 셀프넘버 X

 

 

2 + 2 = 4 

즉 4는 셀프넘버 X

 

3으로 예시를 해봅시다.

 

3 + 3 = 6이 됨으로 6은 셀프넘버 X

 

4도 마찬가지로 4 + 4 = 8임으로 8은 셀프넘버 X

 

또한 4도 셀프넘버가 될 수 없죠? 이유는 이미 2에서 2+2 = 4가 나왔기 때문에

셀프넘버가 안됩니다.

 

즉 1부터 각 자리를 더 하면서 더한 값이 나오면 안됩니다.

 

5로 비교해보죠

 

5 + 5 = 10임으로 10은 셀프넘버 X

 

그다음 6으로 봅시다.

 

6 + 6 = 12 

12는 셀프넘버 X

 

하지만 6도 셀프넘버가 될 수 없죠?

 

왜냐하면 3에서 이미 3 + 3 = 6을 했기 때문에 6은 셀프넘버가 될 수 없습니다.

 

그렇다면 코드는 어떤식으로 짜야 할까요?

 

1부터 시작해서 각 자리 수를 때서 값을 더 함.

 

그 값 더한 것을 배열이든 list든 넣음.

 

이렇게 하면

 

1 + 1 = 2

2 + 2 = 4

3 + 3 = 6

4 + 4 = 8

 

즉 이런식으로 셀프넘버가 아닌 값들이 저장됩니다.

 

그 값들을 다 담은 후 

 

리스트를 출력할때 이 값이 들어있지 않다면 값을 출력하면 됩니다.

 

package com.algorithm;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main{

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        
        for(int i=1; i<=10000;i++){
            int temp = i;
            int sum = i;
            while (temp > 0){
                sum = sum + (temp%10); // 각 자리수를 자르기
                temp = temp/10;
            }
            list.add(sum); //더한 값을 넣는다
        }
        Collections.sort(list);
        for(int i=1; i<=10000;i++){

            if(!list.contains(i)){ // 만약 이 값이 없다면 셀프넘버임으로 출력
                
                System.out.println(i);
            }
        }

    }
}