Vibe.ai
Published 2023. 11. 6. 06:03
2193.이친수 StudyingπŸ“‘
λ°˜μ‘ν˜•

문제

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

μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ 제좜 μ •λ‹΅ 맞힌 μ‚¬λžŒ μ •λ‹΅ λΉ„μœ¨
2 초 128 MB 91755 39024 29652 41.053%

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

풀이

방법 1 (μ—­μˆœ)

문제λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜μ™€ 같이 λ‘κ°€μ§€μ˜ κ·œμΉ™μ„ λ³Όμˆ˜μžˆλ‹€.

  1. μ΄μΉœμˆ˜λŠ” 0으둜 μ‹œμž‘ν•˜μ§€ μ•ŠμŒ.
  2. μ΄μΉœμˆ˜λŠ” 1이 λ‘λ²ˆ μ—°μ†μœΌλ‘œ λ‚˜νƒ€λ‚˜μ§€μ•ŠμŒ.

μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜μ™€ 같이 μ„€λͺ…ν• μˆ˜μžˆλ‹€.

1) 4자리수 쀑 2κ°œλŠ” 3자리수의 λͺ¨λ“  κ°œμˆ˜μ™€ κ°™λ‹€.
2) 4자리수 쀑 1κ°œλŠ” 2자리수의 λͺ¨λ“  κ°œμˆ˜μ™€ κ°™λ‹€.

μ΄λŠ” n=5 μΌλ•Œλ„ μ μš©λœλ‹€.

1) 5자리수 쀑 3κ°œλŠ” 4자리수의 λͺ¨λ“  κ°œμˆ˜μ™€ κ°™λ‹€.
2) 5자리수 쀑 2κ°œλŠ” 3자리수의 λͺ¨λ“  κ°œμˆ˜μ™€ κ°™λ‹€.

이λ₯Ό 톡해 점화식을 κ΅¬ν•˜λ©΄

dp[n] = dp[n-1] + dp[n-2] 

λ‹€μŒμœΌλ‘œ 이문제λ₯Ό 보면 n의 λ²”μœ„κ°€ 1~90κΉŒμ§€ 이닀. n=90일 경우λ₯Ό 보면 46항이 λ λ•Œ, 2971215073이 λ˜μ–΄, int의 λ²”μœ„λ₯Ό μ΄ˆκ³Όν•˜κ²Œ λœλ‹€. 즉, νŠΉμ •μˆ˜λ‘œ λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°’(λͺ¨λ“ˆλŸ¬)λ₯Ό μ‚¬μš©ν•΄μ„œ 좜λ ₯ν•˜κ±°λ‚˜, int μ΄μƒμ˜ μžλ£Œν˜•μ„ μ΄μš©ν•΄μ•Όν•œλ‹€. (이해가 μ•ˆκ°„λ‹€λ©΄ 문제의 점화식을 λ³΄λ©΄λœλ‹€. 이 점화식은 ν”Όλ³΄λ‚˜μΉ˜μˆ˜μ—΄κ³Ό 같은것을 λ³Όμˆ˜μžˆλŠ”λ°, ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ„ λŒ€μž…ν•΄μ„œ 계산해보면 닡이 λ‚˜μ˜¨λ‹€... κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ μ¦κ°€λœλ‹€.) 어쨋든 μ΄λŸ¬ν•œ 이유 λ•Œλ¬Έμ— longμžλ£Œν˜•μ„ μ‚¬μš©ν•΄μ•Όν•œλ‹€!

μ½”λ“œ

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class Main { 
    static int n; 
    static long dp[] = new long[91]; 
    public static void main(String[] args) throws Exception {
         BufferedReader br = new BufferedReader(new 
         InputStreamReader(System.in)); 
         n = Integer.parseInt(br.readLine()); 
         dp[0] = 0;
         dp[1] = 1; 
          for (int i = 2; i <= n; i++) { 
              dp[i] = dp[i-1] + dp[i-2];  //점화식 λŒ€μž….
              }
            System.out.println(dp[n]); 
        } 
    }

λ‹€μŒ 방법도 μ‚΄νŽ΄λ³΄μž.

방법2(이차원배열)

μ‚΄νŽ΄λ³΄λ©΄, 3μžλ¦¬μˆ˜μ—μ„œ 4μžλ¦¬μˆ˜κ°€ λ˜λŠ” 뢀뢄이닀. μ΄λ•Œ μΆ”κ°€λ˜λŠ” 뢀뢄은 λΉ¨κ°„μƒ‰μœΌλ‘œ ν‘œμ‹œν•œκ²ƒμ΄λ‹€.

κ·œμΉ™μ„ μ‚΄νŽ΄λ³΄λ©΄, μ΄μΉœμˆ˜μ—μ„œ 1이 λ‘λ²ˆ μ—°μ†μœΌλ‘œ λ‚˜νƒ€λ‚˜μ§€ μ•ŠμœΌλ―€λ‘œ 11이 λ‚˜νƒ€λ‚˜λŠ”κ²ƒμ€ λΆˆκ°€λŠ₯ν•˜λ‹€. 즉 λ§ˆμ§€λ§‰μ˜ λλ‚˜λŠ” 수λ₯Ό κΈ°μ€€μœΌλ‘œ μ‚΄νŽ΄λ³΄λ©΄ 될것이닀. 3μžλ¦¬μˆ˜μ—μ„œ λ§ˆμ§€λ§‰μ— λλ‚˜λŠ”μˆ˜κ°€ 0일 κ²½μš°μ—λŠ” 0,1 이 λ“€μ–΄μ˜¬μˆ˜μžˆκ³ , 1μΌκ²½μš°μ—λŠ” 0만 κ°€λŠ₯ν•˜λ‹€.

A : 0으둜 μ‹œμž‘λ˜λŠ” 경우 : 00 01 κ°€λŠ₯

dp[4][0] = dp[3][0] + dp[3][1]

B: 1둜 μ‹œμž‘λ˜λŠ” 경우: 10 κ°€λŠ₯

dp[4][1] = dp[3][0]

μ΄λ ‡κ²Œ λ‚˜νƒ€λ‚Όμˆ˜ μžˆκ² λ‹€. 이λ₯Ό 톡해 점화식을 뽑아보면?

dp[n][0] = dp[n-1][0] + dp[n-1][1]
dp[n][1] = dp[n-1][0]

μ΄λ ‡κ²Œ λ‚˜λˆ μ„œ κ΅¬ν•΄μ§€κ²Œ λœλ‹€. 그리고 두가지 경우λ₯Ό 합쳐쀀닀면 μ›ν•˜λŠ” 닡을 κ΅¬ν• μˆ˜μžˆλ‹€.

μ½”λ“œ

package 기초1.Day16.μ •ν•΄μ˜;  

import java.util.Scanner;  

public class 이친수 {  

public static void main(String[] args) {  
Scanner sc = new Scanner(System.in);  

int n = sc.nextInt();  

long[][] dp = new long[n+1][2]; //int ν˜• μ„ μ–Έμ‹œμ— λ²”μœ„κ°€ μ΄ˆκ³Όλœλ‹€.  

/*  
μ΄λ ‡κ²Œ μ΄ν•΄ν•˜μž. n=2 μΌλ•Œ, 2자리수 00 01 10 11 μ΄λ ‡κ²Œ λ‚˜μ˜¬κ²ƒμ΄λ‹€.  
μ—¬κΈ°μ„œ dp[자리수][λ§ˆμ§€λ§‰λ’·μžλ¦¬] = 이친수의 개수 둜 μ„ μ–Έν•˜μž.  
즉, dp[2][0] 이라면 {0}0 {0}1 μ΄λ ‡κ²Œ 될것이고, 이친수의 κ°―μˆ˜λŠ” 0이닀. μ™œλ‚˜ν•˜λ©΄ μ œμΌμ•žμ—λŠ” 0μΌμˆ˜κ°€ μ—†κΈ°λ•Œλ¬Έ.  
dp[2][1] 이라면 {1}0 {1}1 μ΄λ ‡κ²Œ 될것이닀. 이친수의 κ°œμˆ˜λŠ” 1이닀.  
*/  

dp[1][1] = 1;  
dp[1][0] = 0;  

for(int i=2; i<=n; i++){  
dp[i][0] = dp[i-1][0] + dp[i-1][1]; //[4][0] -> {100}0, {100}1  
dp[i][1] = dp[i-1][0]; // [4][1] -> {101}0 μ΄λŸ°μ‹μœΌλ‘œ...!  
}  

System.out.println(dp[n][0] + dp[n][1]);  
sc.close();  
}  
}
λ°˜μ‘ν˜•
profile

Vibe.ai

@hai02y

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!