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

[λ°±μ€€] 2193번: 이친수 - C++ λ³Έλ¬Έ

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

[λ°±μ€€] 2193번: 이친수 - C++

.23 2021. 7. 23. 01:06
문제

0κ³Ό 1둜만 이루어진 수λ₯Ό μ΄μ§„μˆ˜λΌ ν•œλ‹€. μ΄λŸ¬ν•œ μ΄μ§„μˆ˜ 쀑 νŠΉλ³„ν•œ μ„±μ§ˆμ„ κ°–λŠ” 것듀이 μžˆλŠ”λ°, 이듀을 이친수(pinary number)라 ν•œλ‹€. μ΄μΉœμˆ˜λŠ” λ‹€μŒμ˜ μ„±μ§ˆμ„ λ§Œμ‘±ν•œλ‹€.

 

  1. μ΄μΉœμˆ˜λŠ” 0으둜 μ‹œμž‘ν•˜μ§€ μ•ŠλŠ”λ‹€.
  2. μ΄μΉœμˆ˜μ—μ„œλŠ” 1이 두 번 μ—°μ†μœΌλ‘œ λ‚˜νƒ€λ‚˜μ§€ μ•ŠλŠ”λ‹€. 즉, 11을 λΆ€λΆ„ λ¬Έμžμ—΄λ‘œ 갖지 μ•ŠλŠ”λ‹€.

예λ₯Ό λ“€λ©΄ 1, 10, 100, 101, 1000, 1001 등이 μ΄μΉœμˆ˜κ°€ λœλ‹€. ν•˜μ§€λ§Œ 0010101μ΄λ‚˜ 101101은 각각 1, 2번 κ·œμΉ™μ— μœ„λ°°λ˜λ―€λ‘œ μ΄μΉœμˆ˜κ°€ μ•„λ‹ˆλ‹€.

N(1 ≤ N ≤ 90)이 μ£Όμ–΄μ‘Œμ„ λ•Œ, N자리 이친수의 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 N이 주어진닀.

 

좜λ ₯

첫째 쀄에 N자리 이친수의 개수λ₯Ό 좜λ ₯ν•œλ‹€.


DPλ₯Ό μ΄μš©ν•˜μ—¬ ν’€ 수 μžˆλŠ” 문제.

μ΄μΉœμˆ˜λŠ” 0으둜 μ‹œμž‘ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ 1이 μ—°μ†μœΌλ‘œ 두 자리 이상 λ‚˜μ˜€μ§€ μ•ŠλŠ” μ΄μ§„μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. 첫 번째 κ²½μš°λΆ€ν„° 풀어쓰닀보면 금방 κ·œμΉ™μ„ μ°Ύμ•„λ‚Ό 수 μžˆλŠ” λ¬Έμ œλΌμ„œ, μ–΄λŠμ •λ„ νŽΌμ³λ†“κ³  정리λ₯Ό 해보면 λ‹€μŒκ³Ό κ°™λ‹€.

 

N = 1 : { 1 }

N = 2 : { 10 }

N = 3 : { 100, 101 }

N = 4 : { 1000, 1001, 1010 }

N = 5 : { 10000, 10001, 10010, 10100, 10101 }

....

 

맨 μ•ž 10을 μ œμ™Έν•˜λ©΄ λ’€μ˜ μˆ«μžκ°€ μΌμ •ν•œ κ·œμΉ™μ„ 가지고 λ°˜λ³΅λ˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.

N = 4λ₯Ό κ΄€μ°°ν•˜λ©΄ 맨 μ•ž 10 뒀에 N = 2μΌλ•Œμ˜ μ΄μΉœμˆ˜κ°€ λΆ™μ–΄ 1010이 λ˜λŠ” κ²½μš°μ™€, N = 3μΌλ•Œ 맨 μ•žμžλ¦¬μΈ 1을 μ œμ™Έν•œ 숫자(00, 01)이 λΆ™μ–΄ 각각 1000, 1001이 λ˜λŠ” 경우λ₯Ό λ³Ό 수 μžˆλ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ N = 5λ₯Ό κ΄€μ°°ν•˜λ©΄ 맨 μ•ž 10 뒀에 N = 3μΌλ•Œμ˜ μ΄μΉœμˆ˜κ°€ λΆ™μ–΄ 10100, 10101이 λ˜λŠ” κ²½μš°μ™€, N = 4μΌλ•Œμ˜ 맨 μ•žμžλ¦¬λ₯Ό μ œμ™Έν•œ 숫자(000, 001, 010)이 λΆ™μ–΄ 10000, 10001, 10010이 λ˜λŠ” 경우λ₯Ό λ³Ό 수 μžˆλ‹€.

μ΄λ ‡κ²Œ N번째의 μ΄μΉœμˆ˜λ“€μ€ (N - 1)λ²ˆμ§Έμ™€ (N - 2)번째 μ΄μΉœμˆ˜λ“€μ˜ μ‘°ν•©μœΌλ‘œ λ§Œλ“€μ–΄μ§€λŠ” κ·œμΉ™μ„ λ°œκ²¬ν•  수 μžˆλ‹€. λ”°λΌμ„œ 점화식은 λ‹€μŒκ³Ό 같이 λ‚˜μ˜¨λ‹€.

 

D[N] = D[N - 1] + D[N - 2]

 

점화식을 보면 μ•Œκ² μ§€λ§Œ, μ—­μ‹œ ν”Όλ³΄λ‚˜μΉ˜μˆ˜μ—΄μ΄λ‹€. μ˜€λ²„ν”Œλ‘œμš°λ₯Ό 막기 μœ„ν•΄ μžλ£Œν˜•μ„ long long으둜 μ„ μ–Έν•΄μ£ΌλŠ” κ²ƒλ§Œ μ£Όμ˜ν•˜λ©΄ λœλ‹€. λ¬Έμ œλŠ” Bottom-up λ°©μ‹μœΌλ‘œ ν’€μ—ˆλ‹€.

 

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

long long DP(int num);

int main(void) {
    int num;
    scanf("%d", &num);
    printf("%lld\n", DP(num));
    return 0;
}

long long DP(int num) {
    long long Step[MAX] = { 0 };
    Step[1] = 1;

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

    return Step[num];
}
Comments