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

22-yuyu0830 #84

Merged
merged 3 commits into from
Aug 17, 2024
Merged

22-yuyu0830 #84

merged 3 commits into from
Aug 17, 2024

Conversation

yuyu0830
Copy link
Collaborator

@yuyu0830 yuyu0830 commented Aug 5, 2024

πŸ”— 문제 링크

계단 수

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

3~4μ‹œκ°„

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

❓ 문제

image


❗ 풀이

λ‹Ήμ΅œ μ–΄λ–»κ²Œ 접근해야할지 κ°ˆν”Όκ°€ μž‘νžˆμ§€ μ•Šμ•˜λ‹€..

1️⃣ 첫번째 풀이


κ³„λ‹¨μˆ˜λŠ” 항상 각 μžλ¦¬μˆ˜κ°€ 1 차이가 λ‚˜μ•Όν•œλ‹€. ν˜„μž¬ μˆ˜κ°€ 345 라고 ν•˜λ©΄ μ•žμ— 2 ν˜Ήμ€ 4λ₯Ό 뢙인 2345, 4345 와 뒀에 4 ν˜Ήμ€ 6을 뢙인 3454, 3456 κ°€ 올 수 μžˆλ‹€. 이 점에 μ°©μ•ˆν•΄ ν˜„μž¬ μˆ˜μ—΄μ˜ 길이 i, μˆ˜μ—΄μ˜ μ‹œμž‘ 수 j, μˆ˜μ—΄μ˜ 끝 수 k λ₯Ό μ €μž₯ν•˜λŠ” DP λ°°μ—΄λ‘œ ν•΄κ²°ν•˜λ € ν–ˆλ‹€.

ν˜„μž¬ μˆ˜μ—΄μ΄ j둜 μ‹œμž‘ν•΄ k둜 λλ‚˜λŠ” i 길이의 μˆ˜μ—΄μ΄λΌλ©΄ μ‹œμž‘ μˆ˜κ°€ j - 1 ν˜Ήμ€ j + 1 μ΄λ©΄μ„œ k둜 λλ‚˜λŠ” i + 1 길이의 μˆ˜μ—΄κ³Ό μ‹œμž‘ μˆ˜κ°€ j μ΄λ©΄μ„œ k - 1 ν˜Ήμ€ k + 1둜 λλ‚˜λŠ” i + 1 길이의 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.


이 방법을 μ œμΆœν•΄λ³΄μ§„ μ•Šμ•˜μ§€λ§Œ λ‹Ήμž₯ ν’€λ‹€κ°€ κ²ΉμΉ˜λŠ” 수λ₯Ό ν•΄κ²°ν•  수 μ—†λ‹€λŠ” 결둠에 λ„λ‹¬ν–ˆλ‹€.

μˆ˜μ—΄ 2345와 μˆ˜μ—΄ 1234κ°€ μžˆμ„ λ•Œ, 두 μˆ˜μ—΄ λͺ¨λ‘ 12345 λΌλŠ” μˆ˜μ—΄μ„ λ§Œλ“€ 수 있기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ μˆ˜μ—΄μ„ μ¦κ°€ν•˜λŠ” λ°©ν–₯을 ν•œ λ°©ν–₯으둜 μ œν•œν•  ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°ν–ˆλ‹€.

2️⃣ λ‘λ²ˆμ§Έ 풀이


μ§„μ§œ λ„μ €νžˆ 1도 λͺ¨λ₯΄κ² μ–΄μ„œ λΈ”λ‘œκ·Έ 풀이λ₯Ό μ°Έκ³ ν–ˆλ‹€. (링크)

μ •λ‹΅ ν’€μ΄λŠ” λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ„ μ΄μš©ν•œλ‹€. ν˜„μž¬ μˆ˜μ—΄μ΄ μ–΄λ–€ μˆ˜λ“€μ„ κ±°μ³μ™”λŠ”μ§€λ₯Ό λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ„ 톡해 ν‘œν˜„ν•  수 μžˆλ‹€. 0 ~ 9κΉŒμ§€μ˜ μˆ«μžκ°€ 1개 이상 μ‘΄μž¬ν•˜λ©΄ 되기 λ•Œλ¬Έμ— ꡳ이 개수λ₯Ό ν‘œν˜„ν•  ν•„μš”λ„ μ—†λ‹€.

1둜 μ‹œμž‘ν•΄ 2둜 λλ‚˜λŠ” 4의 길이의 μˆ˜μ—΄μ˜ 경우 1212, 1232 κ°€ μžˆλ‹€. 이 λ‘˜μ˜ 경우 거쳐온 μˆ«μžλŠ” 각각 [1, 2], [1, 2, 3] 이 λœλ‹€. 이 숫자λ₯Ό 0~9κΉŒμ§€ 총 10bit둜 ν‘œν˜„ν•΄ λ”°λ‘œ λ‹€λ£° 수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄ [0, 1, 2, 3, 4] λ₯Ό 거친 경우 0,000,011,111 둜 ν‘œν˜„ν•  수 μžˆλ‹€. λͺ¨λ“  수λ₯Ό λ‹€ 거친 경우 (즉 1,111,111,111) κ°€ 1023이기 λ•Œλ¬Έμ— 0~1023 κΉŒμ§€λ₯Ό μ €μž₯ν•˜λ©΄ λœλ‹€.

첫번째 ν’€μ΄μ—μ„œ λ΄€λ“― μˆ˜μ—΄μ΄ μ¦κ°€ν•˜λŠ” λ°©ν–₯은 단방ν–₯이 λœλ‹€. μˆ˜μ—΄ 뒀에 숫자λ₯Ό λ§λΆ™μ΄λŠ” λ°©μ‹μœΌλ‘œ μˆ˜μ—΄μ„ λŠ˜λ €κ°€λŠ” 경우 ꡳ이 μˆ˜μ—΄μ˜ μ‹œμž‘μ μ„ μ €μž₯ν•  ν•„μš”κ°€ μ—†λ‹€. 즉 dp 배열을 μˆ˜μ—΄μ˜ 길이 i, ν˜„μž¬ μˆ˜μ—΄μ˜ 끝자리 수 j, μ§€κΈˆκΉŒμ§€ 거쳐온 숫자 kλ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄λ‘œ ν•΄κ²°ν•  수 μžˆλ‹€.

ν˜„μž¬ μˆ˜μ—΄μ˜ 길이가 a, 끝자리 μˆ˜κ°€ b인 μˆ˜μ—΄μ΄ 될 수 μžˆλŠ” 경우의 μˆ˜λŠ” μˆ˜μ—΄μ˜ 길이가 a - 1, 끝자리 μˆ˜κ°€ b - 1 (b > 0), b + 1 (b < 9) 의 합이 될 것이닀. dp λ°°μ—΄ μƒμ—μ„œ μ™Όμͺ½ μœ„ κ°’κ³Ό μ™Όμͺ½ μ•„λž˜ κ°’μ˜ 합이 λœλ‹€.

μ—¬κΈ°μ„œ μ§€κΈˆκΉŒμ§€ 거쳐온 경우의 μˆ˜κ°€ 0~1024 κΉŒμ§€ 있기 λ•Œλ¬Έμ— λͺ¨λ‘ 더해쀀닀.

μ΅œμ’… 값은 길이가 nμ΄λ©΄μ„œ 0~9κΉŒμ§€μ˜ μˆ«μžκ°€ μžˆλŠ” μˆ˜μ—΄μ΄κΈ° λ•Œλ¬Έμ— arr[n][0 ~ 9][1024] 의 값을 λͺ¨λ‘ ν•©ν•œ 값이 정닡이 λœλ‹€.

#include <iostream>

#define MOD 1000000000

using namespace std;

int arr[101][10][1024] = {0, };

int main() {
    int n; cin >> n;

    for (int i = 1; i < 10; i++) {
        arr[1][i][1 << i] = 1;
    }

    for (int i = 2; i <= n; i++) {
        for (int j = 0; j < 10; j++) {
            for (int k = 0; k < 1024; k++) {
                if (j) {
                    arr[i][j][k | (1 << j)] += arr[i - 1][j - 1][k];
                    arr[i][j][k | (1 << j)] %= MOD;
                } 

                if (j != 9) {
                    arr[i][j][k | (1 << j)] += arr[i - 1][j + 1][k];
                    arr[i][j][k | (1 << j)] %= MOD;
                }
            }
        }
    }

    int ans = 0;
    
    for (int i = 0; i < 10; i++) {
        ans += arr[n][i][1023];
        ans %= MOD;
    }

    printf("%d\n", ans);
}

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

문제 이해가 λ„ˆλ¬΄ μ–΄λ €μ› μ–΄μš”.. μ—¬λŸ¬λΆ„μ€ 문제 이해가 νž˜λ“€ λ•Œ μ–΄λ–»κ²Œ ν•΄κ²°ν•˜λ‚˜μš”?

Copy link
Collaborator

@InSange InSange left a comment

Choose a reason for hiding this comment

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

λ”± 봐도 λΉ„νŠΈλ§ˆμŠ€ν‚Ή 문제둜 λ°”λ‘œ νŒŒμ•…ν•  수 μžˆμ—ˆμ§€λ§Œ κ·Έ μˆœμ„œλŠ” μ–΄λ–»κ²Œ 확인해야 감이 잘 μ•ˆμž‘νžˆκΈ΄ ν•˜λ”κ΅°μš”.. 예λ₯Ό λ“€μ–΄ 13자리의 경우 쀑간에 1012345678987 -> 6767, 8989 λ“±κ³Ό 같이 경우의 수의 μ‘΄μž¬κ°€ λ„ˆλ¬΄ 컀지기 λ•Œλ¬Έμ— μ΄μ „μ˜ 자리λ₯Ό μ²΄ν¬ν•œλ‹€κ³€ 해도 λ²”μ£Όκ°€ λ„ˆλ¬΄ μ»€μ„œ 머리둜 이해가 잘 μ•ˆλ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€..
저도 ν•΄λ‹Ή λΈ”λ‘œκ·Έμ˜ 글을 μ½μ—ˆλŠ”λ° 자리수, λ§ˆμ§€λ§‰ 도착 수, λ°©λ¬Έ 확인 μ΄λΌλŠ” 것을 눈으둜 보아도 λ¨Έλ¦¬λ‘œλŠ” 아직 λ‘œμ§μ„ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜κ² μŠ΅λ‹ˆλ‹€... μ„Έμƒμ—λŠ” λ˜‘λ˜‘ν•œ μ‚¬λžŒλ“€μ΄ λ„ˆλ¬΄ λ§Žμ•„.

@InSange
Copy link
Collaborator

InSange commented Aug 8, 2024

πŸ”— 문제 링크

계단 수

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

3~4μ‹œκ°„

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

❓ 문제

image

❗ 풀이

λ‹Ήμ΅œ μ–΄λ–»κ²Œ 접근해야할지 κ°ˆν”Όκ°€ μž‘νžˆμ§€ μ•Šμ•˜λ‹€..

1️⃣ 첫번째 풀이

κ³„λ‹¨μˆ˜λŠ” 항상 각 μžλ¦¬μˆ˜κ°€ 1 차이가 λ‚˜μ•Όν•œλ‹€. ν˜„μž¬ μˆ˜κ°€ 345 라고 ν•˜λ©΄ μ•žμ— 2 ν˜Ήμ€ 4λ₯Ό 뢙인 2345, 4345 와 뒀에 4 ν˜Ήμ€ 6을 뢙인 3454, 3456 κ°€ 올 수 μžˆλ‹€. 이 점에 μ°©μ•ˆν•΄ ν˜„μž¬ μˆ˜μ—΄μ˜ 길이 i, μˆ˜μ—΄μ˜ μ‹œμž‘ 수 j, μˆ˜μ—΄μ˜ 끝 수 k λ₯Ό μ €μž₯ν•˜λŠ” DP λ°°μ—΄λ‘œ ν•΄κ²°ν•˜λ € ν–ˆλ‹€.

ν˜„μž¬ μˆ˜μ—΄μ΄ j둜 μ‹œμž‘ν•΄ k둜 λλ‚˜λŠ” i 길이의 μˆ˜μ—΄μ΄λΌλ©΄ μ‹œμž‘ μˆ˜κ°€ j - 1 ν˜Ήμ€ j + 1 μ΄λ©΄μ„œ k둜 λλ‚˜λŠ” i + 1 길이의 μˆ˜μ—΄κ³Ό μ‹œμž‘ μˆ˜κ°€ j μ΄λ©΄μ„œ k - 1 ν˜Ήμ€ k + 1둜 λλ‚˜λŠ” i + 1 길이의 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.

이 방법을 μ œμΆœν•΄λ³΄μ§„ μ•Šμ•˜μ§€λ§Œ λ‹Ήμž₯ ν’€λ‹€κ°€ κ²ΉμΉ˜λŠ” 수λ₯Ό ν•΄κ²°ν•  수 μ—†λ‹€λŠ” 결둠에 λ„λ‹¬ν–ˆλ‹€.
μˆ˜μ—΄ 2345와 μˆ˜μ—΄ 1234κ°€ μžˆμ„ λ•Œ, 두 μˆ˜μ—΄ λͺ¨λ‘ 12345 λΌλŠ” μˆ˜μ—΄μ„ λ§Œλ“€ 수 있기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ μˆ˜μ—΄μ„ μ¦κ°€ν•˜λŠ” λ°©ν–₯을 ν•œ λ°©ν–₯으둜 μ œν•œν•  ν•„μš”κ°€ μžˆλ‹€κ³  μƒκ°ν–ˆλ‹€.

2️⃣ λ‘λ²ˆμ§Έ 풀이

μ§„μ§œ λ„μ €νžˆ 1도 λͺ¨λ₯΄κ² μ–΄μ„œ λΈ”λ‘œκ·Έ 풀이λ₯Ό μ°Έκ³ ν–ˆλ‹€. (링크)

μ •λ‹΅ ν’€μ΄λŠ” λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ„ μ΄μš©ν•œλ‹€. ν˜„μž¬ μˆ˜μ—΄μ΄ μ–΄λ–€ μˆ˜λ“€μ„ κ±°μ³μ™”λŠ”μ§€λ₯Ό λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ„ 톡해 ν‘œν˜„ν•  수 μžˆλ‹€. 0 ~ 9κΉŒμ§€μ˜ μˆ«μžκ°€ 1개 이상 μ‘΄μž¬ν•˜λ©΄ 되기 λ•Œλ¬Έμ— ꡳ이 개수λ₯Ό ν‘œν˜„ν•  ν•„μš”λ„ μ—†λ‹€.

1둜 μ‹œμž‘ν•΄ 2둜 λλ‚˜λŠ” 4의 길이의 μˆ˜μ—΄μ˜ 경우 1212, 1232 κ°€ μžˆλ‹€. 이 λ‘˜μ˜ 경우 거쳐온 μˆ«μžλŠ” 각각 [1, 2], [1, 2, 3] 이 λœλ‹€. 이 숫자λ₯Ό 0~9κΉŒμ§€ 총 10bit둜 ν‘œν˜„ν•΄ λ”°λ‘œ λ‹€λ£° 수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄ [0, 1, 2, 3, 4] λ₯Ό 거친 경우 0,000,011,111 둜 ν‘œν˜„ν•  수 μžˆλ‹€. λͺ¨λ“  수λ₯Ό λ‹€ 거친 경우 (즉 1,111,111,111) κ°€ 1023이기 λ•Œλ¬Έμ— 0~1023 κΉŒμ§€λ₯Ό μ €μž₯ν•˜λ©΄ λœλ‹€.

첫번째 ν’€μ΄μ—μ„œ λ΄€λ“― μˆ˜μ—΄μ΄ μ¦κ°€ν•˜λŠ” λ°©ν–₯은 단방ν–₯이 λœλ‹€. μˆ˜μ—΄ 뒀에 숫자λ₯Ό λ§λΆ™μ΄λŠ” λ°©μ‹μœΌλ‘œ μˆ˜μ—΄μ„ λŠ˜λ €κ°€λŠ” 경우 ꡳ이 μˆ˜μ—΄μ˜ μ‹œμž‘μ μ„ μ €μž₯ν•  ν•„μš”κ°€ μ—†λ‹€. 즉 dp 배열을 μˆ˜μ—΄μ˜ 길이 i, ν˜„μž¬ μˆ˜μ—΄μ˜ 끝자리 수 j, μ§€κΈˆκΉŒμ§€ 거쳐온 숫자 kλ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄λ‘œ ν•΄κ²°ν•  수 μžˆλ‹€.

ν˜„μž¬ μˆ˜μ—΄μ˜ 길이가 a, 끝자리 μˆ˜κ°€ b인 μˆ˜μ—΄μ΄ 될 수 μžˆλŠ” 경우의 μˆ˜λŠ” μˆ˜μ—΄μ˜ 길이가 a - 1, 끝자리 μˆ˜κ°€ b - 1 (b > 0), b + 1 (b < 9) 의 합이 될 것이닀. dp λ°°μ—΄ μƒμ—μ„œ μ™Όμͺ½ μœ„ κ°’κ³Ό μ™Όμͺ½ μ•„λž˜ κ°’μ˜ 합이 λœλ‹€.

μ—¬κΈ°μ„œ μ§€κΈˆκΉŒμ§€ 거쳐온 경우의 μˆ˜κ°€ 0~1024 κΉŒμ§€ 있기 λ•Œλ¬Έμ— λͺ¨λ‘ 더해쀀닀.

μ΅œμ’… 값은 길이가 nμ΄λ©΄μ„œ 0~9κΉŒμ§€μ˜ μˆ«μžκ°€ μžˆλŠ” μˆ˜μ—΄μ΄κΈ° λ•Œλ¬Έμ— arr[n][0 ~ 9][1024] 의 값을 λͺ¨λ‘ ν•©ν•œ 값이 정닡이 λœλ‹€.

#include <iostream>

#define MOD 1000000000

using namespace std;

int arr[101][10][1024] = {0, };

int main() {
    int n; cin >> n;

    for (int i = 1; i < 10; i++) {
        arr[1][i][1 << i] = 1;
    }

    for (int i = 2; i <= n; i++) {
        for (int j = 0; j < 10; j++) {
            for (int k = 0; k < 1024; k++) {
                if (j) {
                    arr[i][j][k | (1 << j)] += arr[i - 1][j - 1][k];
                    arr[i][j][k | (1 << j)] %= MOD;
                } 

                if (j != 9) {
                    arr[i][j][k | (1 << j)] += arr[i - 1][j + 1][k];
                    arr[i][j][k | (1 << j)] %= MOD;
                }
            }
        }
    }

    int ans = 0;
    
    for (int i = 0; i < 10; i++) {
        ans += arr[n][i][1023];
        ans %= MOD;
    }

    printf("%d\n", ans);
}

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

문제 이해가 λ„ˆλ¬΄ μ–΄λ €μ› μ–΄μš”.. μ—¬λŸ¬λΆ„μ€ 문제 이해가 νž˜λ“€ λ•Œ μ–΄λ–»κ²Œ ν•΄κ²°ν•˜λ‚˜μš”?

μ €λŠ” 문제λ₯Ό 봀을 λ•Œ λ– μ˜€λ₯΄λ©΄ λ°”λ‘œ μž‘μ„±ν•˜λŠ” 식이긴 ν•©λ‹ˆλ‹€. ν•΄λ‹Ή λ°©μ‹μœΌλ‘œ ν…ŒμΌ€ 돌렀보고 ν‹€λ¦¬λŠ” 게 있으면 μ˜ˆμ™Έ 처리 ν˜Ήμ€ λ†“μΉœ μ•Œκ³ λ¦¬μ¦˜μ„ νŒŒμ•…ν•˜κΈ° μœ„ν•΄ μ˜ˆμ™Έ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ₯Ό μ°Ύμ•„λ³΄λŠ” νŽΈμž…λ‹ˆλ‹€. μ™„μ „ μ–΄λ €μš΄ λ¬Έμ œλŠ” ν•˜λ“œμ½”λ”©μœΌλ‘œ λΉ‘κ΅¬ν˜„μ„ 해보닀가 λ„μ €νžˆ μ•ˆλ˜κ² μœΌλ©΄ μ°Έκ³ ν•˜λŠ” 식이긴 ν•©λ‹ˆλ‹€.

Copy link
Collaborator

@seongwon030 seongwon030 left a comment

Choose a reason for hiding this comment

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

λΉ„νŠΈλ§ˆμŠ€ν‚Ήμ΄λΌλŠ” μ•Œκ³ λ¦¬μ¦˜μ„ 처음 μ ‘ν•΄λ΄μš”. 이 λ¬Έμ œμ—μ„œ 수λ₯Ό λΉ„νŠΈλ‘œ ν‘œν˜„ν•΄μ•Ό ν•œλ‹€λŠ” 아이디어λ₯Ό μ–»κΈ°λΆ€ν„°κ°€ μ–΄λ ΅λ‹€κ³  μƒκ°λ˜λ„€μš”. λμžλ¦¬κ°€ 0인 κ²½μš°μ™€ 9인 경우의 μ˜ˆμ™Έμ²˜λ¦¬λ„ μƒκ°ν•˜λ©΄μ„œ dp둜 κ°±μ‹ ν•˜λŠ” 거라 많이 배울 수 있던 λ¬Έμ œμ˜€λ„€μš”. μ €λŠ” λ¬Έμ œκ°€ μ΄ν•΄λ˜μ§€ μ•Šμ„ λ•Œ λ¬Έμ œμ„€λͺ…을 λ…ΈνŠΈμ— μ“°κ³  계속 λ³΄λŠ” 것 κ°™μ•„μš”. 그러고 정말 λͺ¨λ₯΄κ² λ‹€ μ‹ΆμœΌλ©΄ μ‚¬μ΄νŠΈλ₯Ό μ°Έκ³ ν•©λ‹ˆλ‹€.

@yuyu0830 yuyu0830 merged commit 6b93228 into main Aug 17, 2024
@yuyu0830 yuyu0830 deleted the 22-yuyu0830 branch August 17, 2024 17:51
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