𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 2331번: λ°˜λ³΅μˆ˜μ—΄ - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 2331번: λ°˜λ³΅μˆ˜μ—΄ - C++

.23 2021. 12. 23. 14:16
문제

λ‹€μŒκ³Ό 같이 μ •μ˜λœ μˆ˜μ—΄μ΄ μžˆλ‹€.

  • D[1] = A
  • D[n] = D[n-1]의 각 자리의 숫자λ₯Ό P번 κ³±ν•œ μˆ˜λ“€μ˜ ν•©

예λ₯Ό λ“€μ–΄ A=57, P=2일 λ•Œ, μˆ˜μ—΄ DλŠ” [57, 74(=52+72=25+49), 65, 61, 37, 58, 89, 145, 42, 20, 4, 16, 37, …]이 λœλ‹€. κ·Έ λ’€μ—λŠ” μ•žμ„œ λ‚˜μ˜¨ μˆ˜λ“€(57λΆ€ν„°κ°€ μ•„λ‹ˆλΌ 58λΆ€ν„°)이 λ°˜λ³΅λœλ‹€.

이와 같은 μˆ˜μ—΄μ„ 계속 κ΅¬ν•˜λ‹€ 보면 μ–Έμ  κ°€ 이와 같은 λ°˜λ³΅μˆ˜μ—΄μ΄ λœλ‹€. μ΄λ•Œ, λ°˜λ³΅λ˜λŠ” 뢀뢄을 μ œμ™Έν–ˆμ„ λ•Œ, μˆ˜μ—΄μ— λ‚¨κ²Œ λ˜λŠ” μˆ˜λ“€μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μœ„μ˜ μ˜ˆμ—μ„œλŠ” [57, 74, 65, 61]의 λ„€ 개의 μˆ˜κ°€ λ‚¨κ²Œ λœλ‹€.

 

μž…λ ₯

첫째 쀄에 A(1 ≤ A ≤ 9999), P(1 ≤ P ≤ 5)κ°€ 주어진닀.

 

좜λ ₯

첫째 쀄에 λ°˜λ³΅λ˜λŠ” 뢀뢄을 μ œμ™Έν–ˆμ„ λ•Œ, μˆ˜μ—΄μ— λ‚¨κ²Œ λ˜λŠ” μˆ˜λ“€μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.


1λΆ€ν„° 1000000κΉŒμ§€ vectorν˜•νƒœμ˜ 배열을 λ§Œλ“  λ’€, λͺ¨λ‘ 0으둜 μ΄ˆκΈ°ν™”ν•΄μ€€λ‹€. 이 λ²‘ν„°λŠ” 방문횟수λ₯Ό count ν•΄μ£ΌλŠ” 데 μ‚¬μš©λœλ‹€. DFS의 μž¬κ·€μ μΈ μ„±μ§ˆμ„ μ΄μš©ν•˜μ—¬ AλΆ€ν„° λ°©λ¬Έν•˜μ—¬ κ·œμΉ™μ— 따라 μ—°μ‚°ν•œ 결과의 정점듀을 μ°¨λ‘€μ°¨λ‘€ λ°©λ¬Έν•΄κ°€λ©° 방문횟수λ₯Ό μ„Έμ–΄μ€€λ‹€. μˆ˜μ—΄μ„ κ΅¬ν•˜λ©΄μ„œ λ°˜λ³΅λ˜λŠ” μˆ˜κ°€ λ‚˜μ™”μ„ λ•ŒλŠ” λ°©λ¬Έ νšŸμˆ˜κ°€ 2 이상이 λμ„λ•Œμ΄λ―€λ‘œ, 이λ₯Ό ν™•μΈν•˜μ—¬ 처음으둜 λ°˜λ³΅λ˜λŠ” μˆ˜κ°€ λ°œμƒν•˜μ˜€μ„ λ•Œ ν•¨μˆ˜λ₯Ό λΉ μ Έλ‚˜μ˜¨λ‹€.

이후 ν•œ λ²ˆμ”© λ°©λ¬Έν•œ μ •μ μ˜ κ°œμˆ˜κ°€ λ°˜λ³΅μˆ˜μ—΄μ˜ 길이가 λœλ‹€.

 

μ½”λ“œ
#include <cstdio>
#include <vector>
#include <cmath>
#define MAX 1000000

using namespace std;

vector<int> visited(MAX, 0);
void DFS(int num, int P);

int main(void) {
    int A, P;
    scanf("%d %d", &A, &P);
    DFS(A, P);
    
    int count = 0;
    for(int i = 0; i <= MAX; i++) {
        if(visited[i] == 1)
            count++;
        else
            continue;
    }

    printf("%d\n", count);
    return 0;
}

int calc(int A, int P) {
    int temp = A;
    int sum = 0;
    while(temp > 0) {
        sum += (int)(pow(temp % 10, P));
        temp /= 10;
    }
    return sum;
}

void DFS(int num, int P) {
    visited[num]++;
    if(visited[num] > 2) return; // λ°˜λ³΅λ˜λŠ” μˆ˜κ°€ ν•œλ°”ν€΄ λŒμ•˜μ„ λ•Œ 멈좀
    DFS(calc(num, P), P);
}
Comments