πŸ’  Cpp/[BOJ] λ‹¨κ³„λ³„λ‘œ 풀어보기

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

선달 2021. 9. 2. 09:16
λ°˜μ‘ν˜•

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

 

문제

μ…€ν”„ λ„˜λ²„λŠ” 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보닀 μž‘κ±°λ‚˜ 같은 μ…€ν”„ λ„˜λ²„λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© μ¦κ°€ν•˜λŠ” μˆœμ„œλ‘œ 좜λ ₯ν•œλ‹€.

 

풀이

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int d (int n){
    
    int tmp = 0, divisor = 10, sum = 0;
    vector <int> v;
    
    //주어진 μ •μˆ˜ n의 각 μžλ¦¬μˆ«μžλ“€μ„ v에 λ„£λŠ”λ‹€
    while(true){
        tmp = n % divisor;
        if(tmp == n){
            v.push_back(tmp / (divisor/10));
            divisor *= 10;
            break;
        }
        v.push_back(tmp / (divisor/10));
        divisor *= 10;
    }
    
    //각 μžλ¦¬μˆ«μžλ“€μ˜ ν•© sum
    for(int i=0; i<v.size(); i++){
        sum += v[i];
    }

    return sum + n;
    
}

int main() {
    
    vector <int> value;
    
    //벑터 valueμ—μ„œ 1λΆ€ν„° 10000κΉŒμ§€ μˆ˜λ“€μ˜ dκ°’λ“€ μ €μž₯
    for(int i=1; i<10001; i++){
        value.push_back(d(i));
    }
    
    for(int i=1; i<10001; i++){
        //value에 iκ°€ μžˆλ‹€λ©΄ i 좜λ ₯
        if(find(value.begin(), value.end(), i) == value.end()){
            cout << i << "\n";
        }
    }
    
    return 0;
}

 

+)

주어진 숫자의 각 자리 μˆ«μžλŠ”

[πŸ₯‘ BOJ λ‹¨κ³„λ³„λ‘œ 풀어보기/5단계 _ 1차원배열] - [C++][BOJ] λ°±μ€€ 2577번: 숫자의 개수

 

[C++][BOJ] λ°±μ€€ 2577번: 숫자의 개수

https://www.acmicpc.net/problem/2577 2577번: 숫자의 개수 첫째 쀄에 A, λ‘˜μ§Έ 쀄에 B, μ…‹μ§Έ 쀄에 Cκ°€ 주어진닀. A, B, CλŠ” λͺ¨λ‘ 100보닀 ν¬κ±°λ‚˜ κ°™κ³ , 1,000보닀 μž‘μ€ μžμ—°μˆ˜μ΄λ‹€. www.acmicpc.net 문제 μ„Έ 개..

whkakrkr.tistory.com

μ—μ„œ κ΅¬ν–ˆλ˜ 것과 같은 λ°©λ²•μœΌλ‘œ κ΅¬ν–ˆλ‹€

 

 

++)

while(num>0) {
	sum = num % 10
	num /= 10
}

훨씬 μ‰¬μš΄ μ½”λ“œκ°€ μžˆμ—ˆλ‹€..

λ°˜μ‘ν˜•