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

[λ°±μ€€] 12852번: 1둜 λ§Œλ“€κΈ° 2 - C++ λ³Έλ¬Έ

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

[λ°±μ€€] 12852번: 1둜 λ§Œλ“€κΈ° 2 - C++

.23 2022. 7. 6. 16:12
문제

μ •μˆ˜ X에 μ‚¬μš©ν•  수 μžˆλŠ” 연산은 λ‹€μŒκ³Ό 같이 μ„Έ 가지 이닀.

  1. Xκ°€ 3으둜 λ‚˜λˆ„μ–΄ 떨어지면, 3으둜 λ‚˜λˆˆλ‹€.
  2. Xκ°€ 2둜 λ‚˜λˆ„μ–΄ 떨어지면, 2둜 λ‚˜λˆˆλ‹€.
  3. 1을 λΊ€λ‹€.

μ •μˆ˜ N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μœ„와 같은 μ—°μ‚° μ„Έ 개λ₯Ό 적절히 μ‚¬μš©ν•΄μ„œ 1을 λ§Œλ“€λ €κ³  ν•œλ‹€. 연산을 μ‚¬μš©ν•˜λŠ” 횟수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 106보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜ N이 주어진닀.

 

좜λ ₯

첫째 쀄에 연산을 ν•˜λŠ” 횟수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

λ‘˜μ§Έ μ€„μ—λŠ” N을 1둜 λ§Œλ“œλŠ” 방법에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” 수λ₯Ό 곡백으둜 κ΅¬λΆ„ν•΄μ„œ μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•œλ‹€. 정닡이 μ—¬λŸ¬ 가지인 κ²½μš°μ—λŠ” μ•„λ¬΄κ±°λ‚˜ 좜λ ₯ν•œλ‹€.


λ™μ κ³„νšλ²•μ„ μ‚¬μš©ν•˜μ—¬ ν’€ 수 μžˆλŠ” 문제.

πŸ”— 1463번: 1둜 λ§Œλ“€κΈ° - C++

μ•žλΆ€λΆ„μ΄ λ™μΌν•œ 문제이기 λ•Œλ¬Έμ— 초기 μ ‘κ·Ό 방식은 μœ„μ˜ λ¬Έμ œμ™€ λ™μΌν•˜κ²Œ ν’€λ©΄ λœλ‹€.

λ‹€λ§Œ λ‘˜μ§Έμ€„μ— N을 1둜 λ§Œλ“œλŠ” 방법에 ν¬ν•¨λ˜μ–΄ μžˆλŠ” 수λ₯Ό 곡백으둜 κ΅¬λΆ„ν•΄μ„œ 좜λ ₯ν•΄μ•Όν•˜λŠ” μ‘°κ±΄λ•Œλ¬Έμ— 탐색이 ν•œλ²ˆ λ“€μ–΄κ°€κ²Œ λœλ‹€.

1둜 λ§Œλ“œλŠ” 쑰건에 λ§žμ„ λ•Œ λ§ˆλ‹€ λ…Έλ“œλ₯Ό μ—°κ²°ν•΄μ€€ λ’€, κ°„λ‹¨ν•œ DFSλ₯Ό 톡해 ν¬ν•¨λ˜μ–΄ μžˆλŠ” 수λ₯Ό 좜λ ₯ν•΄μ£Όλ©΄ λœλ‹€.

 

μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ²Œ ν•΄μ„œ ν’€ 수 μžˆλŠ” 방법이 μžˆμ„ν…λ° κ·Έλƒ₯ λ˜λŠ” λŒ€λ‘œ ν’€μ–΄μ„œ κ·ΈλŸ°κ°€ μ½”λ“œκ°€ μ§€μ €λΆ„ν•˜λ‹€ .....

2와 3 λ™μ‹œμ— λ‚˜λˆ λ–¨μ–΄μ§€λŠ” 수λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ 아무 생각 없이 if - else if둜 λΆ„κΈ°ν–ˆλ‹€κ°€λŠ” 642같은 μˆ˜μ—μ„œ 걸릴 수 있기 λ•Œλ¬Έμ— μœ μ˜ν•΄μ•Ό ν•œλ‹€.

 

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

using namespace std;

void DP(int num);
void DFS(int num);

int graph[MAX];
bool visited[MAX];

int main(void) {
    int N;
    scanf("%d", &N);

    DP(N);
    printf("\n");
    return 0;
}

void DP(int num) {
    int result[MAX];

    graph[1] = 1;
    graph[2] = 1;
    graph[3] = 1;

    for(int i = 2; i <= num; i++) {
        graph[i] = i - 1;
        result[i] = result[i - 1] + 1;

        if(i % 3 == 0) {
            if(result[i / 3] < result[i]) {
                graph[i] = i / 3;
                result[i] = result[i / 3] + 1;
            }
        }
        if(i % 2 == 0) {
            if(result[i / 2] < result[i]) {
                graph[i] = i / 2;
                result[i] = result[i / 2] + 1;
            }
        }
    }
    
    printf("%d\n", result[num]);
    DFS(num);
}

void DFS(int num) {
    visited[num] = true;
    printf("%d ", num);

    if(num == 1) return;
    
    int next = graph[num];
    if(!visited[next])
        DFS(next);
}
Comments