Algorithm/λ¬Έμ œν’€μ΄

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

moaoh 2023. 7. 6. 19:15

문제

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

예제 μž…λ ₯ 1 λ³΅μ‚¬

3

예제 좜λ ₯ 1 λ³΅μ‚¬

2
 

풀이과정

문제λ₯Ό μ–΄λ–»κ²Œ 접근을 ν•΄μ•Όν• μ§€ 계속 고민을 ν•˜λ‹€κ°€ λ­”κ°€ κ·œμΉ™μ„±μ„ κ°€μ§€κ³  μžˆμ„ κ±° κ°™μ•„μ„œ 경우의 수λ₯Ό μ μ–΄λ³΄κ²Œλ˜μ—ˆλ‹€.

ν˜•μ‹μœΌλ‘œ μ΄λ£¨μ–΄μ Έμžˆκ³  개수λ₯Ό 보면

ν”Όλ³΄λ‚˜μΉ˜μ˜ μˆ˜μ—΄κ³Ό 같은 κ·œμΉ™μ„±μ„ κ°€μ§€κ³  μžˆλŠ”κ²ƒμ„ 확인할 수 μžˆμ–΄μ„œ codeλ₯Ό μž‘μ„±ν• λ•Œλ„ λ˜‘κ°™μ΄ κ·œμΉ™μ„ μ μš©μ‹œμΌœμ„œ μž‘μ„±ν•˜κ²Œ λ˜μ—ˆλ‹€.

a[i + 1] = a[i] + a[i - 1]

code

#include <iostream>

int		main(void)
{
	long long n;
	long long a[91] = {0,};

	std::cin >> n;
	a[0] = 0;
	a[1] = 1;
	a[2] = 1;
	for(int i = 2; i <= n; i++) {
		a[i + 1] = a[i] + a[i - 1];
	}
	std::cout << a[n];

	return (0);
}


ν›„κΈ°

였늘 ν‘Ό λ¬Έμ œμ™€ 같이 점화식이 μˆ¨κ²¨μ ΈμžˆλŠ” λ¬Έμ œλ“€μ€ μ½”ν…Œ 같은 것듀을 λ³Όλ•Œ μ–΄λ–»κ²Œ 접근을 ν•΄μ•Όν• μ§€ λͺ¨λ₯΄κ² λ‹€.

운이 μ’‹μœΌλ©΄ 점화식이 μžˆμ„ μˆ˜λ„ μžˆλŠ”κ±°κ³  μ•„λ‹ˆλ©΄ μ•„μ˜ˆ κ·œμΉ™μ„±μ΄ μ—†λŠ” 문제일 μˆ˜λ„ μžˆλŠ”λ°.

κ·œμΉ™μ„±μ—†λŠ” 문제λ₯Ό 점화식이 μžˆλ‹€κ³  생각을 ν•˜κ³  계속 κ·œμΉ™μ„±λ§Œ 찾으렀고 ν•˜λ‹€κ°€ μ˜€λžœμ‹œκ°„μ΄ μ§€λ‚˜λ²„λ¦¬λ©΄ 그만큼 μ†ν•΄λ‘œ λ‹€κ°€μ˜€κ²Œλ˜κ³ ,

κ·Έλ ‡λ‹€κ³  점화식이 μ—†λ‹€κ³  가정을 ν•˜κ³  문제의 접근을 ν•˜κ²Œ 되면 점화식을 κ°€μ§€κ³  ν‘ΈλŠ”κ²ƒλ³΄λ‹€ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€κ³  μ‹œκ°„ λ³΅μž‘λ„κ°€ 더 κ°€μ€‘μ΄λ˜λ‹ˆ 점화식이 μžˆλŠ”μ§€ μ—†λŠ”μ§€λ₯Ό λΉ λ₯΄κ²Œ νŒλ‹¨ν•  수 μžˆλŠ” μš”λ Ήμ„ κΈΈλŸ¬μ•Όν•  κ±°  κ°™λ‹€.