1. ๋ฌธ์ ์ค๋ช
๋ญ๋์ ๊ทน์ฅ์ด ํฐ์ผ์ ์๋๋ฐ, ์ ์์ผ๋ก ์ฎ๊ฒจ ์์ ์ ์์...
์๋ฅผ ๋ค์ด 3๋ฒ ์ข์์ ์ฐ ์ฌ๋์ 4๋ฒ ์ข์์ ์์๋ ๋๊ณ , 2๋ฒ ์ข์์ ์์๋ ๋จ.
ํ์ง๋ง 3๋ฒ ์ข์์ ์ฐ ์ฌ๋์ด ์ ์ ์ด์ธ์ ์ข์์๋ ๋ชป ์์. ์๋ฅผ ๋ค์ด 7๋ฒ ์ข์์ด๋ 1๋ฒ ์ข์์ผ๋ก ์ด๋์ ๋ถ๊ฐ.
๋, VIP์์ด๋ผ๋ ๊ฐ๋
์ด ์์. ์ด๋ฆ์ด๋ ๋ง์ง ์๊ฒ ์ด๊ฑฐ ์ฐ ์ฌ๋์ ๊ทธ๋ฅ ๊ทธ ์๋ฆฌ ์์์ผํจ.
์๋ฅผ ๋ค์ด 7๋ฒ ์ข์์ด VIP์์ด๋ฉด 7๋ฒ ์ฐ ์ฌ๋์ 7๋ฒ์ ๋ฌด์กฐ๊ฑด ์์์ผํจ.
N๋ฒ๊น์ง์ ์ข์์ด ์๊ณ , ๋ง์์ผ ๋, ์ฌ๋๋ค๋ผ๋ฆฌ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ ์์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ผ.
2. ์ ๊ทผ ๋ฐฉ์
๋์ ํ ๋ชป ํ๊ฒ ์ด์ ๋ค๋ฅธ ์ฌ๋ ํ์ด๋ฅผ ๋ดค๋ค.KEY WORD
: DP
(1) ๊ธฐ๋ณธ ์๋ฆฌ
ํจํด์ด ์ ๋ณด์ด๋ฉด, ๋ฌด์์ ๊ฐ์ง์๋ฅผ ์ ์ด์ ํจํด์ ์๊ฐํด๋ด์ผ ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค. ํด๋น ๋ฌธ์ ์ ํจํด์ ๋ค์๊ณผ ๊ฐ๋ค.
(์ผ๋จ ๊ณ ์ ์์ ์๊ฐํ์ง ๋ง์.)
์ข์์ด 1
๊ฐ์ผ ๋, ์์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ 1
๊ฐ์ง ์ด๋ค.
์ข์์ด 2
๊ฐ ์ผ ๋, ํฐ์ผ 1๋ฒ๊ณผ ํฐ์ผ 2๋ฒ์ด ์๋ก ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ ์์ ์ ์๋ค. (1,2), (2,1) ๋ฐ๋ผ์ ๊ฒฝ์ฐ์ ์๋ 2
๊ฐ์ง๋ค.
์ข์์ด 3
๊ฐ ์ผ ๋, (1,2,3), (1,3,2), (2,1,3)์ผ๋ก 3
๊ฐ์ง์ด๋ค.
์ข์์ด 4
๊ฐ ์ผ ๋, (1,2,3,4), (2,1,3,4), (1,3,2,4), (1,2,4,3),(2,1,4,3) ์ผ๋ก 5
๊ฐ์ง ์ด๋ค.
์ข์์ด 5
๊ฐ ์ผ ๋, (1,2,3,4,5), (2,1,3,4,5), (1,3,2,4,5), (1,2,4,3,5), (1,2,3,5,4),(2,1,4,3,5),(2,1,3,5,4),(1,3,2,5,4)๋ก 8
๊ฐ์ง์ด๋ค.
ํผ๋ณด๋์น ์์ด๊ณผ ๊ฑฐ์ ์ ์ฌํ ํํ์์ ์ ์ ์๋ค. ๋ฐ๋ผ์ DP ์ ํ์
์(i>2 ์ผ ๋) dp[i] = dp[i-1] + dp[i-2]
์ด๋ค.
(2) ๊ณ ์ ์์ ์ฐ์ ํด๋ณด์.
์ด๊ฑด ์ฝ๋ค. ๊ณ ์ ์์ ์ด์งํผ ๊ณ ์ ๋์ด์์ด์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ง๋ค์ง ๋ชปํ๋ค. ๋ํ ์ ์์ ์๋ฆฌ๋ง ๋ฐ๊ฟ ์ ์์ผ๋,๊ณ ์ ์์ด ์๊ธฐ๋ฉด, ๊ณ ์ ์ ์ดํ๋ถํฐ ๋ค์ ํผ๋ณด๋์น ์์ด ์์์ด๋ค.
๋ฐ๋ผ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง์ด๋ค.
- ์์ ์๊ฐํ ๊ทธ๋๋ก ๊ณ ์ ์ ๋์ฌ ๋๋ง๋ค dp ์๋ก ์ธ๊ธฐ
- dp๋ ์ผ๋จ N๊ฐ์ ๊ดํด์ ์ ๋ถ ๊ตฌํด๋๊ณ , ๊ณ ์ ์์ ๋ง๋ ๋๋ง๋ค ๊ฐ์ฉ ๋ฒ์ ๋งํผ ๊ตฌํด์ ์ฐ๊ธฐ
1๋ฒ์ ์ง๊ด์ ์ด๋๊น ๋์ด๊ฐ๊ณ , 2๋ฒ์ ๊ฒฝ์ฐ๊ฐ ๋ฌด์์ ๋ปํ๋์ง ์์๋ณด์
์ผ๋จ ๋ฌธ์ ์ ์์์ฒ๋ผ N=9๋ผ๊ณ ํ ๋, dp๋ฅผ ๋ค ๊ตฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
4๋ฒ์ด ๊ณ ์ ์์ด๋ผ๋ฉด ๋ฌด์จ ์๋ฆฌ์ผ๊น? 1~3๋ฒ 3๊ฐ์ ์๋ฆฌ์์๋ง ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ฉด ๋๋ค. ๋ฐ๋ผ์ ๋ต์ 3์ด๋ค.
7๋ฒ์์ ๊ณ ์ ์์ ๋ ๋ง๋๋ฉด 5,6๋ฒ ์๋ฆฌ ๋ฐ๊พธ๊ธฐ๋ง ์๊ฐํ๋ฉด ๋๋ค. ๋ฐ๋ผ์ ๋ต์ 2์ด๋ค.
๋ง์ง๋ง๋ 8,9 ๋ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ฉด ๋๋๊น ๋ต์ 2์ด๋ค.
๊ฐ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ ๊ฒฝ์ฐ๋ ๋์์ ์ผ์ด๋๋ฏ๋ก ๊ณฑํด์ผ ํ๋ค. ๋ฐ๋ผ์ 3x2x2 ํด์ ์ ๋ต์ 12์ด๋ค.
3. ์ฝ๋ ๋ถ์
1๋ฒ ํ์ด
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
int ans = 1;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int [] dp = new int[N+1];
dp[0] = -1;
int M = Integer.parseInt(br.readLine());
for (int i = 0; i < M; i++) {
int now = Integer.parseInt(br.readLine());
dp[now] = -1;
}
for (int i = 1; i <= N; i++) {
if(dp[i] == -1) continue;
if(dp[i-1] == -1) {dp[i] = 1;}
else if(dp[i-2] == -1) {dp[i] = 2;}
else dp[i] = dp[i-1] + dp[i-2];
if(i+1 > N || dp[i+1] == -1) ans *= dp[i];
}
System.out.println(ans);
}
}
2๋ฒ ํ์ด
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
if(N == 1) {
System.out.println(1);
return;
}
int [] dp = new int [N+1];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= N; i++){
dp[i] = dp[i-1] + dp[i-2];
}
int ans = 1;
int vip_recent = 0;
st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int vip_now = Integer.parseInt(st.nextToken());
ans *= dp[vip_now - vip_recent-1];
vip_recent = vip_now;
}
ans *= dp[N-vip_recent];
System.out.println(ans);
}
}
!! ์ dp[0] = 0์ด ์๋๋ผ 1 ์ ๋๊น?
์๋ dp[0]๋ ์ฌ์ฉํ์ง ์๋ ๋ฐฐ์ด ์์์ด๋ค. ํ์ง๋ง 2๋ฒ ํ์ด์ ๊ฐ์ด ํ๋ฉด ์ธ ๋๊ฐ ์๋ค. ๋ง์ฝ ๊ณ ์ ์์ด 9๊ฐ์ ์ข์ ์ค 6๋ฒ 7๋ฒ์ ์ฐ๋ฌ์ ์๋ค๊ณ ํด๋ณด์.
๋ง์ฝ 7-6-1์ด๋ฏ๋ก dp[0]๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ, dp[0] = 0 ์ด๋ฉด ์ดํ, ๊ฒฝ์ฐ์ ์๋ก ๋ญ ๊ตฌํ๋ ๋ต์ด 0์ด ๋์จ๋ค.
๊ณ ์ ์์ด ์ฐ๋ฌ์ ์์ ๊ฒฝ์ฐ, ๊ทธ ์ฌ์ด ์ข์ ๋ฐฐ์น ๊ฒฝ์ฐ์ ์๋ ๋ฑ ๊ทธ ํ๊ฐ์ง ์ด๋ฏ๋ก dp[0] = 1 ๋ก ํด์ผ์ง ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋๋ฐ ์ฐจ์ง์ด ์๋ค.
4. ์ฑ์ฅ ํ๊ธฐ
๋ ๋ฒ์งธ ํ์ด์ dp[0] = 0 ์ด ์๋๋ผ 1์ธ ์ด์ ๋ฅผ ์ฐพ๋๋ฐ ์๊ฐ์ด ๋ง์ด ๋ค์๋ ๊ฒ ๊ฐ๋ค. ์ง๋ฌธ ๊ฒ์ํ์ ๋๊ตฐ๊ฐ ์ฌ๋ฆฐ ์ง๋ฌธ์ ํตํด ๋ต์ ์ ์ ์์๋ค.