๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Coding Test/๋ฐฑ์ค€(BOJ)

[BOJ] ๋ฐฑ์ค€ #1309. ๋™๋ฌผ์› (C++)

๐ŸŽจ ๋ฌธ์ œ

๋ฌธ์ œ ๋งํฌ: https://www.acmicpc.net/problem/1309

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜: ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ๋‚œ์ด๋„: Silver 1

 

 

๐Ÿ’ฌ ํ’€์ด

์ฒ˜์Œ์—๋Š” ์ˆ˜ํ•™ ์กฐํ•ฉ๋ฌธ์ œ ๋А๋‚Œ์œผ๋กœ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€, ๋…ธ๊ฐ€๋‹ค๋กœ ์ง์ ‘ N=1, N=2, N=3, ...์ผ๋•Œ ๊ตฌํ•˜๋‹ค๊ฐ€ DP ๋ฌธ์ œ๋ผ๊ณ  ์‚˜์ด ์™”๋‹ค.

 

์‚ฌ์‹ค ๋‚ด๊ฐ€ ํ‘ผ ๋ฐฉ๋ฒ•์€ N=1๋ถ€ํ„ฐ N=4๊นŒ์ง€ ๋…ธ๊ฐ€๋‹ค๋กœ ์ง์ ‘ ๊ฐ’์„ ๊ตฌํ•œ ๋’ค์—, ๊ทธ๋ƒฅ ๋ผ์›Œ๋งž์ถฐ์„œ ์ ํ™”์‹์„ ๊ตฌํ–ˆ๋‹ค.

ํ•œ๋งˆ๋””๋กœ ์•ผ๋งค๋กœ ํ’€์—ˆ๋‹ค๋Š” ๊ฒƒ,,,ใ…Žใ…Ž

์ฆ‰, ์ง์ ‘ dp[1]=3, dp[2]=7, dp[3]=17, dp[4]=41๊นŒ์ง€ ๊ตฌํ•ด๋†“์€ ๋‹ค์Œ์—, 3,7,17,41,...์—์„œ ์ด์ „ ํ•ญ์„ ์ด์šฉํ•ด์„œ ์ˆซ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋‚˜์˜ฌ์ง€ ๊ปด๋งž์ถฐ ๋ณด๋‹ค๊ฐ€ ์ผ๋ฐ˜ํ™”๋œ ์‹ dp[n] = 2*dp[n-1] + dp[n-2]๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๋„ˆ๋ฌด ์šด๋นจ๋กœ ๋ฌธ์ œ๊ฐ€ ํ’€๋ ค๋ฒ„๋ ค์„œ ์œ„ ์ ํ™”์‹์— ๋Œ€ํ•œ ํ’€์ด๋ฅผ ์ฐพ์•„๋ดค๊ณ , ๊ทธ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์šฐ์„  ํ•œ ์ค„์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” (X,X), (๐Ÿฆ,X), (X,๐Ÿฆ) ์ด๋ ‡๊ฒŒ ์ด 3๊ฐ€์ง€๋‹ค.

์ด์ œ dp[n] : n๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์‚ฌ์ž๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ์ด ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ฅผ ๊ตฌํ•ด๋ณด์ž

  1. ์ด๋•Œ ๋งŒ์•ฝ n๋ฒˆ์งธ ์ค„์— ์‚ฌ์ž๋ฅผ ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, dp[n-1]๊ฐ€์ง€๋‹ค.
  2. ๋˜ ๋งŒ์•ฝ n๋ฒˆ์งธ ์ค„ ์™ผ์ชฝ์— ์‚ฌ์ž๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค๋ฉด, (n-1)๋ฒˆ์งธ ์ค„์— ์‚ฌ์ž๋ฅผ ์˜ค๋ฅธ์ชฝ์— ๋ฐฐ์น˜ํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์•ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋˜ ๋งŒ์•ฝ n๋ฒˆ์งธ ์ค„ ์˜ค๋ฅธ์ชฝ์— ์‚ฌ์ž๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค๋ฉด, (n-1)๋ฒˆ์งธ ์ค„์— ์‚ฌ์ž๋ฅผ ์™ผ์ชฝ์— ๋ฐฐ์น˜ํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์•ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ์œ„ 2,3 ๊ฒฝ์šฐ๋ฅผ ํ•ฉ์น˜๋ฉด, (n-1)๋ฒˆ์งธ ์ค„๊นŒ์ง€๋งŒ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋‹ค๊ฐ€ (n-1)๋ฒˆ์งธ์—๋Š” ์•„์˜ˆ ์•ˆ ํ•˜๋Š” dp[n-2]๋ฅผ ๋”ํ•œ ์ˆ˜๋‹ค. ์ฆ‰, dp[n-1]+dp[n-2]

๋‹ค ๋”ํ•˜๋ฉด ๋‚ด๊ฐ€ ์•ผ๋งค๋กœ ๊ตฌํ•œ ์ ํ™”์‹ dp[n] = 2*dp[n-1] + dp[n-2]๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

 

 

๐Ÿ‘ฉ‍๐Ÿ’ป ์ฝ”๋“œ

C++

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#define MAX 100001
#define MOD 9901
using namespace std;

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	//freopen("input.txt", "rt", stdin);
	int N;
	cin >> N;
	int dp[MAX];
	dp[1] = 3; dp[2] = 7;
	for (int i = 3; i <= N; i++) {
		dp[i] = (2 * dp[i - 1] + dp[i - 2]) % MOD;
	}
	cout << dp[N];

	return 0;
}

 

 

 

๋งŽ์€ ์ฐธ๊ณ  Thank you~๐Ÿ™‡‍โ™€๏ธ

https://guiyum.tistory.com/21

https://hongjw1938.tistory.com/66