λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

[λ°±μ€€] 2193번: 이친수(DP)

by 주발2 2020. 2. 27.
λ°˜μ‘ν˜•

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

 

2193번: 이친수

0κ³Ό 1둜만 이루어진 수λ₯Ό μ΄μ§„μˆ˜λΌ ν•œλ‹€. μ΄λŸ¬ν•œ μ΄μ§„μˆ˜ 쀑 νŠΉλ³„ν•œ μ„±μ§ˆμ„ κ°–λŠ” 것듀이 μžˆλŠ”λ°, 이듀을 이친수(pinary number)라 ν•œλ‹€. μ΄μΉœμˆ˜λŠ” λ‹€μŒμ˜ μ„±μ§ˆμ„ λ§Œμ‘±ν•œλ‹€. μ΄μΉœμˆ˜λŠ” 0으둜 μ‹œμž‘ν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄μΉœμˆ˜μ—μ„œλŠ” 1이 두 번 μ—°μ†μœΌλ‘œ λ‚˜νƒ€λ‚˜μ§€ μ•ŠλŠ”λ‹€. 즉, 11을 λΆ€λΆ„ λ¬Έμžμ—΄λ‘œ 갖지 μ•ŠλŠ”λ‹€. 예λ₯Ό λ“€λ©΄ 1, 10, 100, 101, 1000, 1001 등이 μ΄μΉœμˆ˜κ°€ λœλ‹€. ν•˜μ§€λ§Œ 0010101μ΄λ‚˜ 101101은 각각 1, 2번 κ·œμΉ™μ— μœ„λ°°λ˜

www.acmicpc.net

μ½”λ“œ

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
		long[] dp = new long[91];
		dp[1] = 1;
		dp[2] = 1;
		for(int i=3; i<=90; i++) {
			dp[i] = dp[i-1] + dp[i-2];
		}
		
		System.out.println(dp[N]);
		scan.close();
	}

}

풀이

λŒ€ν‘œμ  DP λ¬Έμ œμž…λ‹ˆλ‹€.

dp[N] -> N개 μžλ¦¬μˆ˜μ— 이친수λ₯Ό λ§Œμ‘±ν•˜λŠ” 경우의 수 라고 생각해 λ΄€μ„λ•Œ, 

Nμžλ¦¬μ— 올 수 μžˆλŠ” μˆ«μžλŠ” 0 κ³Ό 1 이닀.

 

N = 6μΌλ•Œ,

1) xxxxx0

2) xxxxx1

μœ„ λ‘κ°€μ§€μ˜ μΌ€μ΄μŠ€κ°€ μžˆλ‹€.

첫번째 μΌ€μ΄μŠ€λŠ”, λ§ˆμ§€λ§‰μ— 0이 μ˜€λŠ” 경우둜, κ·Έ μ•žμ—λŠ” 0κ³Ό 1이 올 수 μžˆλ‹€.

λ”°λΌμ„œ dp[N] = dp[N-1]κ³Ό λ™μΌν•˜λ‹€.

λ‘λ²ˆμ§Έ μΌ€μ΄μŠ€λŠ”, λ§ˆμ§€λ§‰μ— 1이 μ˜€λŠ” 경우둜, κ·Έ μ•žμ—λŠ” 무쑰건 0이 μ™€μ•Όν•œλ‹€.

그럼 κ·Έ μ•žμ•žμ€? 0κ³Ό 1이 올 수 μžˆλ‹€. -> xxx001 ν˜Ήμ€ xxx101

λ”°λΌμ„œ dp[N] = dp[N-2]와 λ™μΌν•˜λ‹€.

 

μœ„μ˜ 결둠을 λ°”νƒ•μœΌλ‘œ 점화식을 μ„Έμš°λ©΄,

dp[N] = dp[N-1] + dp[N-2] λΌλŠ” 식이 μ„±λ¦½ν•œλ‹€.

 

μ„€λͺ…이 잘 λ˜μ–΄μžˆλŠ” 글을 μ°Έκ³ ν•΄μ„œ μž‘μ„±ν•΄λ³΄λ©΄,

이친수의 쑰건에 μ˜ν•΄ μ΄μΉœμˆ˜λŠ” 무쑰건 1 0 으둜 μ‹œμž‘ν•΄μ•Όν•œλ‹€.

https://blog.naver.com/occidere/220788046159

N=4μΌλ•Œ, 1 0 을 μ œμ™Έν•œ λ„€λͺ¨(2자리)에 λ“€μ–΄μ˜¬ 수 μžˆλŠ” μˆ«μžλŠ” 00, 01, 10 이닀.

00, 01, 10 μˆ«μžλŠ” N=2μΌλ•Œ, N=3μΌλ•Œ 이미 μ‚¬μš©ν–ˆλ˜ μˆ«μžλ“€μ΄λ‹€.

https://blog.naver.com/occidere/220788046159

λ”°λΌμ„œ dp[N] = dp[N-1] + dp[N-2] λΌλŠ” 점화식이 μ„±λ¦½ν•œλ‹€.

 

* λ¬Έμ œμ—μ„œ 쑰심해야 ν•  점은, N의 λ²”μœ„(자릿수)λŠ” 90κΉŒμ§€μΈλ°, 일정 항을 λ„˜μ–΄κ°€λ©΄ int의 λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ²„λ¦°λ‹€.

λ”°λΌμ„œ λ°°μ—΄μ˜ μžλ£Œν˜•μ€ intκ°€ μ•„λ‹Œ long으둜 μ„ μ–Έν•΄μ•Ό μ •λ‹΅μœΌλ‘œ μ œμΆœλœλ‹€.

λ°˜μ‘ν˜•

λŒ“κΈ€