Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8-H0ngJu #170

Merged
merged 2 commits into from
Apr 11, 2024
Merged

8-H0ngJu #170

merged 2 commits into from
Apr 11, 2024

Conversation

H0ngJu
Copy link
Collaborator

@H0ngJu H0ngJu commented Mar 25, 2024

πŸ”— 문제 링크

μ‰¬μš΄ 계단 수

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

1μ‹œκ°„?

✨ μˆ˜λ„ μ½”λ“œ


이 λ¬Έμ œλŠ” 쑰금만 생각해보면 길이가 K+1인 계단 μˆ˜λŠ” K인 계단 수의 λμžλ¦¬κ°€ μ–΄λ–»κ²Œ λ˜λŠλƒμ— λ”°λΌμ„œ 경우의 μˆ˜κ°€ 1인지 2μΈμ§€λ‘œ κ΅¬λΆ„λ˜λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

image

"이전 길이의 계단 수의 끝자리만 μ•Œλ©΄ λ‹€μŒ 계단 수λ₯Ό ꡬ할 수 μžˆλ‹€"λŠ” 것을 μ•Œμ•˜μ§€λ§Œ, λ¬Έμ œλŠ” '계단 수의 끝자리λ₯Ό μ–΄λ–»κ²Œ μ €μž₯ν•  것인가?'μ˜€μŠ΅λ‹ˆλ‹€.



그런데 쑰금만 더 생각해보면,

길이가 K+1인 계단 수λ₯Ό κ΅¬ν•œλ‹€κ³  κ°€μ •ν•˜μ˜€μ„ λ•Œ, K번째 계단 수의 λμžλ¦¬κ°€ N이라고 ν•˜λ©΄,


N이 0이면 -> μ˜¬λΌκ°€λŠ” 경우의 수 밖에 μ—†μœΌλ―€λ‘œ 길이가 Kλ©΄μ„œ N이 0인 경우의 수 μœ μ§€
N이 9이면 -> λ‚΄λ €κ°€λŠ” 경우의 수 밖에 μ—†μœΌλ―€λ‘œ 길이가 Kλ©΄μ„œ N이 9인 경우의 수 μœ μ§€
N이 2~8이면 -> λ‚΄λ €κ°€κ³  μ˜¬λΌκ°€λŠ” 경우의 수(2가지)κ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 길이가 K μ΄λ©΄μ„œ N이 N-1,N+1경우의 ν•©


이 λ©λ‹ˆλ‹€.



λ”°λΌμ„œ 2차원 DPλ₯Ό μƒμ„±ν•˜κ³ , λ‹€μŒκ³Ό 같은 점화식을 μ„Έμš°λ©΄ μ‰½κ²Œ 문제λ₯Ό ν’€ 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. k == 0이면 DP[i][1]
  2. k == 9이면 DP[i][8]
  3. k == 2~8이면 DP[i][k] = DP[i][k+1] + DP[i][k-1]

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

Copy link
Collaborator

@pknujsp pknujsp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1, 2 차원 dpν…Œμ΄λΈ” λ‘˜ λ‹€ μ‚¬μš©ν•΄μ„œ ν’€μ–΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€

이전 μžλ¦Ώμˆ˜μ—μ„œμ˜ 값을 기반으둜 계단 수 개수λ₯Ό κ΅¬ν•˜λŠ” κ±°λ‹€λ³΄λ‹ˆ
1차원 λ¦¬μŠ€νŠΈλ‘œλ„ 풀이가 κ°€λŠ₯ν•©λ‹ˆλ‹€

1차원 풀이

dpλ₯Ό κ·ΈλŒ€λ‘œ μ“°λ©΄μ„œ κ³„μ‚°ν•˜λ©΄ 이전 μžλ¦Ώμˆ˜μ—μ„œμ˜ 값이 λ°”λ€ŒκΈ° λ•Œλ¬Έμ—
new_dp둜 리슀트λ₯Ό μƒˆλ‘œ μƒμ„±ν•΄μ„œ 이전 값을 λ³΄μ‘΄μ‹œν‚¨ ν›„ μ—°μ‚° ν•©λ‹ˆλ‹€

dp[i] λ₯Ό dp[1],` dp[2] μˆœμ„œλŒ€λ‘œ μ—°μ‚°ν•  λ•Œ dp[2], dp[0], dp[3], dp[1] 의 값이 λ³€κ²½λ©λ‹ˆλ‹€
이 κ³Όμ •μ—μ„œ dp[3]의 값이 iκ°€ 3이 λ˜κΈ°λ„ 전에 λ°”λ€Œμ–΄ λ²„λ¦½λ‹ˆλ‹€

κ·Έλž˜μ„œ iκ°€ 3이 λ˜μ—ˆμ„ λ•Œ 이전 μžλ¦Ώμˆ˜μ—μ„œμ˜ 값이 μ†μ‹€λœ μƒνƒœμ΄λ―€λ‘œ 계단 수의 개수λ₯Ό μ œλŒ€λ‘œ ꡬ할 μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€

N = int(input())
MOD = 1_000_000_000

dp = [1] * 10
dp[0] = 0

for _ in range(1, N):
    new_dp = [0] * 10
    
    for i, c in enumerate(dp):
        if i < 9:
            new_dp[i + 1] += c % MOD
        if i > 0:
            new_dp[i - 1] += c % MOD

    dp = new_dp

print(sum(dp) % MOD)

2차원 풀이

ν™μ£Όλ‹˜ μ½”λ“œλž‘ 거의 λ˜‘κ°™κ΅°μš”

dp = [[0] * 10 for _ in range(N)]

for i in range(1, 10):
    dp[0][i] = 1

for i in range(1, N):
    for j in range(10):
        if j < 9: 
            dp[i][j] += dp[i - 1][j + 1] % MOD
        if j > 0: 
            dp[i][j] += dp[i - 1][j - 1] % MOD

print(sum(dp[-1]) % MOD)

Copy link
Member

@tgyuuAn tgyuuAn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ν™μ£Όλ‹˜ PR을 λ³΄λ‹ˆ DP적 사고방식이 λ„ˆλ¬΄ μ •ν™•ν•©λ‹ˆλ‹€.

κ·Έλ ‡κ²Œ DPλ₯Ό μ ‘κ·Όν•΄μ£Όμ‹œλ©΄ 쒋을 것 κ°™μ•„μš”.

"μ–΄λ–€ 값을 기얡해놔야 λ‹€μŒ 값을 얻을 수 μžˆμ§€?"

"μ–΄λ–€ 정보가 μžˆμ–΄μ•Όμ§€ λ˜‘κ°™μ€ 연산을 λ°˜λ³΅ν•˜μ§€ μ•Šμ„ 수 μžˆμ„κΉŒ?

N번째 값을 κ΅¬ν•˜κΈ° μœ„ν•΄ N-1λ²ˆμ§Έμ—μ„œ μ–΄λ–€ 정보가 ν•„μš”ν•˜μ§€? λ“±λ“± μ΄μš”...!

μ•„μ£Ό μ’‹μ•„μš”,

N = int(input())

dp_table = [[0 for _ in range(10)] for _ in range(N+1)]

for i in range(1,10):
    dp_table[1][i] = 1

for step in range(2,N+1):
    for num in range(10):
        if num != 0 and num != 9:
            dp_table[step][num] = dp_table[step-1][num-1] + dp_table[step-1][num+1]
          
        elif num == 0:
            dp_table[step][num] = dp_table[step-1][num+1]

        elif num == 9:
            dp_table[step][num] = dp_table[step-1][num-1]

print(sum(dp_table[-1])%1_000_000_000)

@Munbin-Lee
Copy link
Member

#include <iostream>
#include <functional>
#include <unordered_map>

using namespace std;

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    unordered_map<int, unordered_map<int, int>> memo;

    for (int i = 0; i <= 9; i++) {
        memo[i][1] = 1;
    }

    int MOD = 1e9;

    function<int(int, int)> dp = [&](int head, int digit) {
        if (memo.contains(head) && memo[head].contains(digit)) {
            return memo[head][digit];
        }

        if (head == 0) {
            return memo[head][digit] = dp(1, digit - 1);
        }

        if (head == 9) {
            return memo[head][digit] = dp(8, digit - 1);
        }

        return memo[head][digit] = (dp(head - 1, digit - 1) + dp(head + 1, digit - 1)) % MOD;
    };

    int N;
    cin >> N;

    int answer = 0;

    for (int i = 1; i <= 9; i++) {
        answer += dp(i, N);
        answer %= MOD;
    }

    cout << answer;

    return 0;
}

계단 수의 μ„œλΈŒμ‹œν€€μŠ€λŠ” 계단 수 -> DPλ₯Ό λ– μ˜¬λ¦¬κ³  νƒ‘λ‹€μš΄μœΌλ‘œ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ λΆ„λ“€ 풀이 λ³΄λ‹ˆκΉŒ 바텀업이 더 κΉ”λ”ν•΄λ³΄μ΄λ„€μš”

λ‹€μŒμ—λŠ” λ°”ν…€μ—…μœΌλ‘œ ν‘ΈλŠ” 방법도 μ—°μŠ΅ν•΄μ˜€κ² μŠ΅λ‹ˆλ‹€.

@H0ngJu H0ngJu merged commit 318bf96 into main Apr 11, 2024
@H0ngJu H0ngJu deleted the 8-H0ngJu branch April 11, 2024 00:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants