본문 바로가기

백준

4673 셀프 넘버

예전에 어려워서 안 풀었는데 다시 마주쳤다.. d(n)에서 n을 찾기는 너무 어려워 보이고 결국 n에서 만들 수 있는 모든 d(n)들을 제거한 다음 남은 수를 출력하기로 했다.

 

조금 걱정되는 부분은 반복문을 세 번 쓴다는 거였는데 각 자리수의 합 구하는 건 얼마 안 걸려서 없다고 치면 반복문이 두번이다. 그리고 반복문 두 번은 10000까지 1초안에 돌 수 있기 때문에 괜찮을 것 같았다! (게다가 -1이면 넘어가서 만 번 보다는 적을 것이다)

 

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;

    for(int i = 0; i <= 10000; i++)
        v.push_back(1);

    for(int i = 1; i <= 10000; i++){
        if(v[i] == -1)
            continue;
        int n = i;

        while(n <= 10000) {
            int sum = 0, tmp = n;

            while(tmp != 0){
                sum += tmp%10;
                tmp /= 10;
            }

            n = n + sum;
            v[n] = -1;
        }
    }
    for(int i = 1; i <= 10000; i++){
        if(v[i] != -1)
            printf("%d\n", i);
    }
}

위 사진에 적은 대로 로직을 짰다.

맞췄음! 시간 0인건 채점할 때 걸린 시간인가? 저 정도로 안 적을 것 같은데

 

'백준' 카테고리의 다른 글

1193 분수찾기  (0) 2019.10.13
15552 빠른 A + B  (0) 2019.10.12
1110 더하기 사이클  (0) 2019.10.11
2839 설탕 배달  (0) 2019.10.11
5586 JOI와 IOI  (0) 2019.10.11