728x90
https://www.acmicpc.net/problem/1003
1003๋ฒ: ํผ๋ณด๋์น ํจ์
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค 0์ด ์ถ๋ ฅ๋๋ ํ์์ 1์ด ์ถ๋ ฅ๋๋ ํ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด์ ์ถ๋ ฅํ๋ค.
www.acmicpc.net
ํ์ด๋ฒ
์ผ๋จ ์ด๋ฒ ๋ฌธ์ ๋ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด ์๋๋ผ ํผ๋ณด๋์น ์์์ 0๊ณผ 1์ด ํธ์ถ๋๋ ํ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค.
์ฝ๋๋ก๋ N์ด ์ต๋ 40๊น์ง ์ฃผ์ด์ง๊ณ , ๊ฐ N์ 0๊ณผ 1์ด ํธ์ถ๋ ํ์๋ฅผ ๋ด์์ผ ํ๋ฏ๋ก 2์ฐจ์ ๋ฐฐ์ด์ด ํ์ํ๋ค.
(๋ํ null ์ฒดํฌ๋ฅผํ๊ธฐ ์ํด์ int[][] ๊ฐ ์๋ Integer[][]๋ก ์ฌ์ฉํ๋ค.)
DP๋ผ๋ ๋ฐฐ์ด์ ์ ์ธํ๊ณ , ํผ๋ณด๋์น ํจ์๋ ๊ฐ N์ ๋ํ 0๊ณผ 1์ ๊ฐ์ DP์ ์ ์ฅํ๋ฉด์ ์ฌ๊ทํธ์ถ์ ์งํํ๋ค.
N์ ๋ํ 0๊ณผ 1์ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฅธ๋ค.
1. N์ ๋ํ 0ํธ์ถ ํ์ = N-1์ 1 ํธ์ถ ํ์
2. N์ ๋ํ 1ํธ์ถ ํ์ = (N-1์ 0 ํธ์ถํ์) + (N-1์ 1 ํธ์ถ ํ์)
์ ์ค๋ช ์ ์ฝ๋๋ก ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
1
2
3
4
5
6
7
8
9
10
|
// ๊ธฐ๋ณธ ๊ฐ(N=0์ผ ๋)
int zero = 1;
int one = 0;
int zero_plus_one = 1;
for (int i = 0; i < N; i++) {
zero = one; // 0ํธ์ถ ํ์๋ฅผ ์ด์ ์ 1ํธ์ถ ํ์๋ก ๋ณ๊ฒฝ
one = zero_plus_one; // 1ํธ์ถ ํ์๋ฅผ ์ด์ ์ 0๊ณผ 1ํธ์ถ ํ์์ ํฉ์ผ๋ก ๋ณ๊ฒฝ
zero_plus_one = zero + one; // 0๊ณผ 1 ํธ์ถ์ ํฉ ๊ณ์ฐ
}
|
cs |
์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ ์ฝ๋
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
|
package com.linerate;
import java.util.Scanner;
public class Main {
static Integer[][] dp = new Integer[41][2];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
dp[0][0] = 1; // N=0 ์ผ ๋์ 0 ํธ์ถ ํ์
dp[0][1] = 0; // N=0 ์ผ ๋์ 1 ํธ์ถ ํ์
dp[1][0] = 0; // N=1 ์ผ ๋์ 0 ํธ์ถ ํ์
dp[1][1] = 1; // N=1 ์ผ ๋์ 1 ํธ์ถ ํ์
int T = in.nextInt();
while(T-- > 0){
int N = in.nextInt();
fibonacci(N);
System.out.println(dp[N][0] + " " + dp[N][1]);
}
}
static Integer[] fibonacci(int N) {
// N์ ๋ํ 0, 1์ ํธ์ถ ํ์๊ฐ ์์ ๋(ํ์ํ์ง ์์ ๊ฐ์ผ ๋)
if(dp[N][0] == null || dp[N][1] == null) {
// ๊ฐ N์ ๋ํ 0 ํธ์ถ ํ์์ 1 ํธ์ถ ํ์๋ฅผ ์ฌ๊ทํธ์ถํ๋ค.
dp[N][0] = fibonacci(N - 1)[0] + fibonacci(N - 2)[0];
dp[N][1] = fibonacci(N - 1)[1] + fibonacci(N - 2)[1];
}
// N์ ๋ํ 0๊ณผ 1, ์ฆ [N][0]๊ณผ [N][1] ์ ๋ด๊ณ ์๋ [N]์ ๋ฐํํ๋ค.
return dp[N];
}
}
|
cs |
728x90