λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
✨ Algorithm

[λ°±μ€€/C++] 4673번 : μ…€ν”„ λ„˜λ²„

by nitronium102 2021. 7. 10.

문제

μ…€ν”„ λ„˜λ²„λŠ” 1949λ…„ 인도 μˆ˜ν•™μž D.R. Kaprekarκ°€ 이름 λΆ™μ˜€λ‹€. μ–‘μ˜ μ •μˆ˜ n에 λŒ€ν•΄μ„œ d(n)을 nκ³Ό n의 각 자리수λ₯Ό λ”ν•˜λŠ” ν•¨μˆ˜λΌκ³  μ •μ˜ν•˜μž. 예λ₯Ό λ“€μ–΄, d(75) = 75+7+5 = 87이닀.

μ–‘μ˜ μ •μˆ˜ n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 수λ₯Ό μ‹œμž‘ν•΄μ„œ n, d(n), d(d(n)), d(d(d(n))), ...κ³Ό 같은 λ¬΄ν•œ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€. 

예λ₯Ό λ“€μ–΄, 33으둜 μ‹œμž‘ν•œλ‹€λ©΄ λ‹€μŒ μˆ˜λŠ” 33 + 3 + 3 = 39이고, κ·Έ λ‹€μŒ μˆ˜λŠ” 39 + 3 + 9 = 51, λ‹€μŒ μˆ˜λŠ” 51 + 5 + 1 = 57이닀. μ΄λŸ°μ‹μœΌλ‘œ λ‹€μŒκ³Ό 같은 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.

33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...

n을 d(n)의 μƒμ„±μžλΌκ³  ν•œλ‹€. μœ„μ˜ μˆ˜μ—΄μ—μ„œ 33은 39의 μƒμ„±μžμ΄κ³ , 39λŠ” 51의 μƒμ„±μž, 51은 57의 μƒμ„±μžμ΄λ‹€. μƒμ„±μžκ°€ ν•œ κ°œλ³΄λ‹€ λ§Žμ€ κ²½μš°λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 101은 μƒμ„±μžκ°€ 2개(91κ³Ό 100) μžˆλ‹€. 

μƒμ„±μžκ°€ μ—†λŠ” 숫자λ₯Ό μ…€ν”„ λ„˜λ²„λΌκ³  ν•œλ‹€. 100보닀 μž‘μ€ μ…€ν”„ λ„˜λ²„λŠ” 총 13κ°œκ°€ μžˆλ‹€. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97

10000보닀 μž‘κ±°λ‚˜ 같은 μ…€ν”„ λ„˜λ²„λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

μž…λ ₯은 μ—†λ‹€.

좜λ ₯

10,000보닀 μž‘κ±°λ‚˜ 같은 μ…€ν”„ λ„˜λ²„λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© μ¦κ°€ν•˜λŠ” μˆœμ„œλ‘œ 좜λ ₯ν•œλ‹€.

풀이

사싀 μ € self number κ°œλ…μ΄ 이해가 잘 μ•ˆλΌμ„œ 문제 ν‘ΈλŠ”λ° μ‹œκ°„μ΄ μ’€ κ±Έλ Έλ‹€.

01. self number의 각 자리수 + self numberλ₯Ό 계산

02. ν•΄λ‹Ή μˆ˜κ°€ 10000보닀 μž‘μœΌλ©΄ μƒμ„±μžκ°€ μ‘΄μž¬ν•œλ‹€λŠ” λœ»μ΄λ―€λ‘œ true둜 ν‘œμ‹œ

03. λ‚˜μ€‘μ— 배열을 λŒλ©΄μ„œ μƒμ„±μžκ°€ μ—†λŠ” μ…€ν”„ λ„˜λ²„(false인 λΆ€λΆ„)λ₯Ό μ²΄ν¬ν•˜μ—¬ 좜λ ₯

 

ν•¨μˆ˜ dλ₯Ό μ •μ˜ν•΄λ³΄λΌκ³  ν–ˆμœΌλ‹ˆ ν•¨μˆ˜ μ“΄ 버전 λ¨Όμ € μ˜¬λ¦¬κ² λ‹€.

#include <iostream>
using namespace std;

bool self[10001];

int d(int num){
    int res = num/1000 + (num%1000)/100+(num%100)/10+num%10+num;
    return res;
}

int main(){
    for (int num=1; num<10000; num++){
        int res = d(num);
        if (res <= 10000)
            self[res]=true;
    }
    
    for (int i=1; i<=10000; i++){
        if (!self[i])
            cout << i << endl;
    }
}

 

ν•¨μˆ˜ μ•ˆ μ“΄ 버전

#include <iostream>
using namespace std;

bool self[10001];

int main(){
    for (int num=1; num<10000; num++){
        int res = num/1000 + (num%1000)/100+(num%100)/10+num%10+num;
        if (res <= 10000)
            self[res]=true;
    }
    
    for (int i=1; i<=10000; i++){
        if (!self[i])
            cout << i << endl;
    }
}

 

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

 

4673번: μ…€ν”„ λ„˜λ²„

μ…€ν”„ λ„˜λ²„λŠ” 1949λ…„ 인도 μˆ˜ν•™μž D.R. Kaprekarκ°€ 이름 λΆ™μ˜€λ‹€. μ–‘μ˜ μ •μˆ˜ n에 λŒ€ν•΄μ„œ d(n)을 nκ³Ό n의 각 자리수λ₯Ό λ”ν•˜λŠ” ν•¨μˆ˜λΌκ³  μ •μ˜ν•˜μž. 예λ₯Ό λ“€μ–΄, d(75) = 75+7+5 = 87이닀. μ–‘μ˜ μ •μˆ˜ n이 μ£Όμ–΄μ‘Œμ„ λ•Œ,

www.acmicpc.net

 

λŒ“κΈ€