https://www.acmicpc.net/problem/1904
1904๋ฒ: 01ํ์ผ
์ง์์ด์๊ฒ 2์ง ์์ด์ ๊ฐ๋ฅด์ณ ์ฃผ๊ธฐ ์ํด, ์ง์์ด ์๋ฒ์ง๋ ๊ทธ์๊ฒ ํ์ผ๋ค์ ์ ๋ฌผํด์ฃผ์ จ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ๊ฐ์ ํ์ผ๋ค์ 0 ๋๋ 1์ด ์ฐ์ฌ ์๋ ๋ฑ์ฅ์ ํ์ผ๋ค์ด๋ค. ์ด๋ ๋ ์ง๊ถ์ ๋์ฃผ๊ฐ ์ง์์ด
www.acmicpc.net
์๊ณ ๋ฆฌ์ฆ [์ ๊ทผ ๋ฐฉ๋ฒ]
์ด ๋ฌธ์ ๋ ๋ง์ฝ N=1 ๋ถํฐ ๊ฒฝ์ฐ์ ์๋ฅผ ์ญ ๋์ดํด๋ณด์๋ค๋ฉด ๋งค์ฐ ์ฝ๊ฒ ํ ์ ์๋ค.
N=6๊น์ง ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋ฅผ ๋์ดํด๋ณด์๋ค.
๊ฐ์๊ฐ ํผ๋ณด๋์น ์์ ์์ด์ฒ๋ผ ์ฆ๊ฐํ๊ณ ์์์ ์ ์ ์๋ค.
์ฆ, N=3์ผ ๋๋ N=1, N=2์ผ ๋์ ๊ฐ์์ ํฉ์ด๋ค.
์ด๋ ํผ๋ณด๋์น ์ ํ์๊ณผ ์ผ์นํจ์ ์ ์ ์๋ค.
ํ์ด
1
2
3
4
5
6
7
8
9
10
11
12
|
static int[] dp = new int[size]; // ๋ฐฐ์ด ๋น์ด์๋ ํ์๋ -1 ์ด๋ผ๊ณ ๊ฐ์
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
int Tile(int N) {
if(dp[N] == -1) { // ํด๋น ๋ฐฐ์ด์ ๊ฐ์ด ์์๊ฒฝ์ฐ ์ฌ๊ทํธ์ถ
dp[N] = Tile(N - 1) + Tile(N - 2);
}
return dp[N];
}
|
cs |
[์ฃผ์ํ ์ ]
int[] ๋ฐฐ์ด์ ๋ํดํธ๊ฐ์ด 0์ผ๋ก ๋์ด์์ผ๋ฏ๋ก ๋ชจ๋ ๋ฐฐ์ด์ -1๋ก ์ด๊ธฐํํด์ค ํ์๊ฐ ์๋ค.
Integer ๋ฐฐ์ด๋ก ํ์ดํ๋ ๋ฐฉ๋ฒ๋ ์์ผ๋ ์ ๋ ฅ ๊ฐ์ด 1,000,000์ด๋ผ ์๋ชปํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก stackoverflow ์๋ฌ๋ฅผ ๋ด๋ฑ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ, ๊ฒฝ์ฐ์ ์๋ฅผ 15746์ผ๋ก ๋๋ ๊ฐ, ์ฆ DP[N] % 15746 ์ ์ถ๋ ฅํด์ผ๋ง ํ๋ค.
์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
|
static int[] dp = new int[size]; // ๋ฐฐ์ด ๋น์ด์๋ ํ์๋ -1 ์ด๋ผ๊ณ ๊ฐ์
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
int Tile(int N) {
if(dp[N] == -1) { // ํด๋น ๋ฐฐ์ด์ ๊ฐ์ด ์์๊ฒฝ์ฐ ์ฌ๊ทํธ์ถ
dp[N] = (Tile(N - 1) + Tile(N - 2)) % 15746;
}
return dp[N];
}
|
cs |
์ฌ๊ธฐ์ ๋ ํ๋ ์ฃผ์ํ ์ ์, ๊ฐ ๋ฐฐ์ด์ ๋๋จธ์ง๊ฐ์ ์ ์ฅํ๋ฉด ๋ค๋ฅธ ์ฌ๊ท์์ ํด๋น ๊ฐ์ ์ฐ๊ฒ๋ ๋, ๋๋จธ์ง ๊ฐ์ ์ฐ๊ฒ๋๋๋ฐ ๊ทธ๋ฌ๋ฉด ์๋ ๊ฐ์ ๋๋จธ์ง์ ๋ฌ๋ผ์ง ์ ์๋ค๊ณ ์๊ฐํ ์ ์๋ค.
์ด ๋ถ๋ถ์ ๋ชจ๋๋ฌ ์ฐ์ฐ์ ๋ถ๋ฐฐ๋ฒ์น์ ์ดํดํ๋ฉด ์ฝ๋ค.
์ฆ, (A+B) % C = (A%C + B%C) % C ๊ฐ ์ฑ๋ฆฝํ๋ค๋ ๊ฒ์ด๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์๋๋ค. ์๊ฐ๋ณต์ก๋๋ ์ด๋ก ์ ์ผ๋ก O(N)์ด๋ผ ํ์ง๋ง ๋งค ์ฌ๊ท๋ง๋ค ์กฐ๊ฑด๋ฌธ์ ๊ฒ์ฌํ๋ ๋ฑ ์ค๋ฒํค๋๊ฐ ์ปค์ง ์ ๋ฐ์ ์์ ๊ฒ์ด๋ค. ๊ทธ๋์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ํธ๋ ๊ฒ์ด ๋์ฑ ํจ์จ์ ์ด๋ค.
์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package com.linerate;
import java.util.Scanner;
public class Main {
public static int[] dp = new int[1000001];;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
// -1 ๋ก ์ด๊ธฐํ
for(int i = 3; i < dp.length; i++) {
dp[i] = -1;
}
System.out.println(Tile(N));
}
public static int Tile(int N) {
if(dp[N] == -1) {
dp[N] = (Tile(N - 1) + Tile((N - 2))) % 15746;
}
return dp[N];
}
}
|
cs |