๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 1904๋ฒ 01 ํ์ผ ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
๋ฌธ์
ํด๊ฒฐ๋ฒ
์ฐ์ ๋ฌธ์ ๋ฅผ ์ ๋๋ก ํ์ ํด๋ณด์.
ํ์ผ์ด๊ณ ๋ญ๊ณ ๋ฅผ ๋ ๋์ ์ฐ๋ฆฌ๋ ์์ด์ ๋ง๋ค์ด์ผ ํ๋ค.
๊ทผ๋ฐ ๊ทธ ์์ด์ ๋ง๋ค๊ธฐ ์ํด์ ์ฃผ์ด์ง๋ ์๊ฐ 2๊ฐ์ง ์ข
๋ฅ์ด๋ค.
- 1
- 00
๊ทธ๋ฆฌ๊ณ ๊ธธ์ด๊ฐ n์ธ ์์ด์ ๋ง๋ค์ด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด์ ๊ธธ์ด๊ฐ n์ธ ์์ด์ ์ฌ๋ฌ๊ฐ ๋ง๋ค์ด์ ๊ท์น์ ์ฐพ์๋ณด์.
tile(1) = 1
tile(2) = 11, 00
tile(3) = 100, 001, 111
tile(4) = 1000, 1001, 0011, 1100, 1111
...
์ฌ๊ธฐ์ ์ข ์๊ฐํด๋ณด์.
๋ง์ฝ 100์ ๊ธธ์ด๋ฅผ ๊ฐ๋ ํ์ผ์ ๋ง๋ ๋ค๊ณ ํ๋ฉด, ์ด๋ป๊ฒ ํ ๊น?
ํ์ผ์ ์ข
๋ฅ๋ 2๊ฐ์ง, 00๊ณผ 1์ด๋ฏ๋ก ๊ฐ๊ฐ์ ๊ธธ์ด๊ฐ 2์ 1์ด๋ค.
๊ทธ๋ผ 100์ ๊ธธ์ด๋ฅผ ๊ฐ๋ ํ์ผ์ ๋ง๋ค๋ ค๋ฉด 98๊ฐ์ ํ์ผ์์ 00 ํ์ผ์ ๋ํด์ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ 99๊ฐ์ ํ์ผ์์ 1 ํ์ผ์ ๋ํด์ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ํฉ์น๋ฉด ๋์ง ์์๊น?
๊ทธ๋ ๋ค.
์ ๋ต์ด๋ค.
๊ทผ๋ฐ ์กฐ๊ฑด์ด ํ๋๊ฐ ๋ ์ถ๊ฐ๋๋ค.
15746์ ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ผ๊ณ ํ๋ค.
์ด๋ ์๋ง ์์ ๋ฒ์๊ฐ ๋๋ฌด ์ปค์ ธ์ ํด๋น ์กฐ๊ฑด์ ์ถ๊ฐํ ๊ฒ์ด๋ค.
๋จ์ํ ์ถ๋ ฅ๋ฌธ์ 15746์ ๋ชจ๋๋ฌํ๋ฉด ์๋ฅผ ๊ณ์ฐํ์ฌ ์ ์ฅํ๋ ๋ด๋ถ ๋ฐฐ์ด tile ์์ int๋ณด๋ค ํฐ ๊ฐ์ด ๋ค์ด๊ฐ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํด ์ค๋ต์ ๋ผ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก tile์ ๊ฐ์ ๊ตฌํ๋ ๋งค ์ฐ์ฐ๋ง๋ค ๋ชจ๋๋ฌ๋ฅผ ์ถ๊ฐํด์ฃผ์.
์ฝ๋๋ก ๊ฐ๊ธฐ ์ ์ ์ ๊น ์ด๊ฒ ํ๋๋ง ์ง๊ณ ๋์ด๊ฐ์ ์ค์ํ๋ค.
๋๋ ์ฒ์์ ๊ทธ๋ฌ๊ณ ๋ง์ ์ฌ๋๋ค์ด ํด๋น ๋ฌธ์ ๋ฅผ ์ง์ ๊ฐ์ง์๋ฅผ ๊ณ์ฐํด๋ณธ ๋ค ํผ๋ณด๋์น ๊ฐ์ ์์ด์ด ๋์์ ํด๋น ์์ ์ ํ์์ผ๋ก ๋์ถฃํด์ ๋ฌธ์ ๋ฅผ ํ๊ณคํ๋ค.
ํ์ง๋ง ์ด๋ฐ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๋งค์ฐ ์ข์ง ์๋ค๊ณ ์๊ฐํ๋ค.
๋์ ๊ณํ๋ฒ์ผ๋ก ํ๋ฆด ์ ์๋ ๋ฌธ์ ์ ๋๋ค์๋ ์ ํ์์ด ์กด์ฌํ๋ค๊ณ ํ๋๋ผ๋ ์ฐ๋ฆฌ๊ฐ ๋ฌธ์ ์ ์
์ถ๋ ฅ์ ์ง์ ์จ๋ณด๋ฉฐ ํญ์ ์ ํ์์ ๊ตฌํ ์ ์๋ ๊ฒ์ ์ ๋ง ํ๋ค๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ข๋ ์ข์ ์๊ณ ๋ฆฌ์ฆ์ ํด๊ฒฐํ๊ณ ์๊ฐํด๋ด๊ธฐ ์ํด์๋ ํ๋ค๋๋ผ๋ ์ ์ด๋ฐ ์ ํ์์ด ๋์๋์ง, ์ด๋ฐ ์ ํ์์ ์ด๋ป๊ฒ ๋์ถํด ๋๋์ง๋ฅผ ์ ์ ์์ด์ผ ํ๋ค.
์ ๋ต ์ฝ๋
Dynamic Programming ์ ํน์ฑ์ 2๊ฐ์ง์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
- Top Down
- Bottom Up
๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋ ํ์ด๋ณด๋๋ก ํ์.
Top Down
TopDown ๋ฐฉ๋ฒ์ ํน์ง์ด๋ผ๊ณ ํ๋ค๋ฉด ์ผ๋จ ์ ํ์์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ ํ์์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค๋ฉด ํด๋น ๋ฌธ์ ๋ ์ค๋ณต ๊ณ์ฐ์ด๋ผ๋ ์น๋ช
์ ์ธ ๋นํจ์จ ๋ฉ์ด๋ฆฌ๊ฐ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ค๋ณต ๊ณ์ฐ์ ์์ ๋ Memoization ๊ณผ์ ์ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.
import java.io.*;
public class Main {
private static int[] tile; // memoization ๋ฐฐ์ด
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
tile = new int[10000001];
bw.write(String.valueOf(tiling(n)));
bw.flush();
bw.close();
}
private static int tiling(int n) {
if(tile[n] > 0) return tile[n]; // ์ด์ ์ ๊ณ์ฐํ๋ ๊ฐ์ด๋ผ๋ฉด ์ค๋ณต ๊ณ์ฐ์ ํ์ง ์๋๋ค.
if (n == 1) return tile[1] = 1;
else if (n == 2) return tile[2] = 2;
else if (n == 3) return tile[3] = 3;
else {
tile[n] = tiling(n-1) + tiling(n-2);
return tile[n] %= 15746;
}
}
}
Bottom Up
Bottom up์ ์ ํ์์ ๋ ผ๋ฆฌ ์์ฒด๋ฅผ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ณํํ๋ ๊ฒ์ด๋ค.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
long[] tile = new long[1000001];
tile[1] = 1; tile[2] = 2; tile[3] = 3;
if(n > 3) {
for(int i = 3; i <= n; i++) {
tile[i] = tile[i-1] + tile[i-2];
tile[i] %= 15746;
}
}
bw.write(String.valueOf(tile[n]));
bw.flush();
bw.close();
}
}
Top Down ๋์ Bottom up ์ ์ฌ์ฉํ๋ค๋ฉด ํจ์ ํธ์ถ ๊ณต๊ฐ์ด ์์์ง๋ฏ๋ก ๊ณต๊ฐ์ ์ผ๋ก ๋ดค์ ๋ ์ด๋์ ์ทจํ ์ ์๋ค.
ํ์ง๋ง ๋ณ์ ์ฌ์ฉ์ด ๋ง์์ง๊ณ ๊ทธ์ ๋ฐ๋ผ ์์ฐ์ค๋ฝ๊ฒ ๋ณ๊ฒฝ๋ ์ ์๋ ์ํ๋๊ฐ ์ฆ๊ฐ๋๋ฉฐ (์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด๋ฅผ ๋ ๋์) ์ง๊ด์ ์ด์ง ์๊ฒ ๋๋ค.
๊ฐ๊ฐ์ ์ฅ๋จ์ ์ ๋ถ๋ช ์กด์ฌํ๋ ๋น๊ตํด๋ณด๊ณ ๋ ์ ์ด์ธ๋ฆฌ๋ ๊ฒ์ ์ ํํ๋ฉด ์ข์๋ฏ ํ๋ค.
ํ์ง๋ง ์ฐ์ต๋๋ ์ ๋งํ๋ฉด ๋ ๋ฐฉ๋ฒ์ ๋ค ์จ๋ณด๋๋ก ํ์.
๋๊ธ