반응형
문제
1003번: 피보나치 함수
각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.
www.acmicpc.net
Problem
- 0.25초라는 시간 제한이 있기 때문에 시간을 신경써야 하는 문제
- 문제 그대로 단순하게 구현하면 무조건 시간 초과가 발생한다.
- 연상량을 줄이기 위해서는 메모제이션을 써야 한다.
메모제이션을 안쓰면
시간복잡도 O(2^N)
메모제이션을 쓰면
시간복잡도 O(N)
Solution
- DP를 이용해서 문제를 해결한다.
- 피보나치 값이 0과 1일때는 바로 "1 0", "0 1" 로 출력한다.
- dp[][] 배열을 만들어서 0과 1을 따로 카운트 한다.
- 현재값은 전의값과 전전값이 합쳐진 값이기 때문에 아래와 같은 방정식이 나오게 된다.
- dp[N] = dp[N-1] + dp[N-2]
Code
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static Integer[][] dp = new Integer[41][2];
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
dp[0][0] = 1;
dp[0][1] = 0;
dp[1][0] = 0;
dp[1][1] = 1;
int tc = Integer.parseInt(br.readLine());
for (int i = 0; i < tc; i++) {
int N = Integer.parseInt(br.readLine());
fibonacci(N);
sb.append(dp[N][0] + " " + dp[N][1] + '\n');
}
System.out.println(sb);
}
static Integer[] fibonacci(int N) {
if (dp[N][0] == null || dp[N][1] == null) {
dp[N][0] = fibonacci(N - 1)[0] + fibonacci(N - 2)[0];
dp[N][1] = fibonacci(N - 1)[1] + fibonacci(N - 2)[1];
}
return dp[N];
}
}
'알고리즘 > 백준(JAVA)' 카테고리의 다른 글
[백준] 1436번: 영화감독 숌 [JAVA-자바] (0) | 2021.01.19 |
---|---|
[백준] 1018번: 체스판 다시 칠하기 [JAVA-자바] (0) | 2021.01.19 |
[백준] 2748번: 피보나치 수 2 [JAVA-자바] (0) | 2021.01.12 |
[백준] 15650번: N과 M(2) [JAVA-자바] (0) | 2021.01.08 |
[백준] 15649번: N과 M(1) [JAVA-자바] (0) | 2021.01.07 |
댓글