πŸ• Baaaaaarking/0x10κ°• - λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°

[BOJ][C++] λ°±μ€€ 2193번: 이찬수

선달 2023. 5. 8. 23:28
λ°˜μ‘ν˜•

https://www.acmicpc.net/problem/2193

 

2193번: 이친수

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

www.acmicpc.net

 

문제

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자리 이친수의 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

i-1자리 이찬수 쀑 0으둜 λλ‚˜λŠ” 수 뒀에 0μ΄λ‚˜ 1을 λΆ™μ—¬μ„œ i자리 이찬수λ₯Ό λ§Œλ“€ 수 μžˆλ‹€

i-1자리 이찬수 쀑 1둜 λλ‚˜λŠ” 수 뒀에 0을 λΆ™μ—¬μ„œ i자리 이찬수λ₯Ό λ§Œλ“€ 수 μžˆλ‹€

 

λ”°λΌμ„œ i-1자리 이찬수 갯수λ₯Ό μ•ˆλ‹€λ©΄ i자리 이찬수 κ°―μˆ˜λ„ ꡬ할 수 μžˆλ‹€

이에 dp벑터λ₯Ό μ„ μ–Έν•˜μ—¬ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•˜μ˜€λ‹€

 

dp[0][i] = 0으둜 λλ‚˜λŠ” i자리 이찬수 갯수
dp[1][i] = 1둜 λλ‚˜λŠ” i자리 이찬수 갯수

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<vector<long long>> dp(2, vector<long long>(91)); 
    dp[0][1] = 0;
    dp[1][1] = 1;
    for(int i=2; i<=90; i++) {
        dp[0][i] = dp[0][i-1] + dp[1][i-1];
        dp[1][i] = dp[0][i-1];
    }
    
    int n;
    cin >> n;
    
    cout << dp[0][n] + dp[1][n];
    
    return 0;
}
λ°˜μ‘ν˜•