문제
https://www.acmicpc.net/problem/2193
문제 탐색하기
- N자리 이친수의 개수 구하기
- N = 1인 경우, 이친수 개수 1개 (1)
- N = 2인 경우, 이친수 개수 1개 (10)
- N = 3인 경우, 이친수 개수 2개 (100, 101)
- N = 4인 경우, 이친수 개수 3개 (1000, 1001, 1010)
- 위의 결과를 보면, N자리는 N-1의 마지막 끝자리에 따라 결정난다.
- 뒷자리가 0으로 끝나는 경우
- 뒤에 0, 1 붙이기
- 뒷자리가 1로 끝나는 경우
- 뒤에 0 붙이기
DP 설계하기
- dp[i][0] : 숫자 N을 만드는 경우의 수 중 끝자리가 0인 경우의 수
- dp[i][1] : 숫자 N을 만드는 경우의 수 중 끝자리가 1인 경우의 수
- 초기값
- dp[1][0] = 0
- dp[1][1] = 1
- i 자리의 끝자리가 0으로 끝나는 경우
- dp[i][0] = dp[i-1][0] + dp[i-1][1]
- i 자리의 끝자리가 1로 끝나는 경우
- dp[i][1] += dp[i-1][0]
가능한 시간복잡도
입력 범위 ( 1 ≤ N ≤ 90)
N까지의 DP를 탐색하기 위 for 문 시간 복잡도 O(N)
코드 설계하기
- 이친수 개수를 구할 N자리를 입력받는다.
- DP 초기값을 설정한다.
- DP 점화식을 세운다
- 뒷자리가 0으로 끝나는 경우 : 뒤에 0, 1 붙이기
- 뒷자리가 1로 끝나는 경우 : 뒤에 0 붙이기
- 뒷자리가 0인 경우의 수와 1인 경우의 수를 더한다.
풀이 코드
※ dp 값을 담을 배열을 생성할 때, long 타입으로 하는 것을 명심하자 !
int 타입으로 선언하면 32비트 크기까지만 저장할 수 있기 때문에 오버플로우가 생길 수 있다. long 타입은 64비트 크기까지 저장 가능
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long[][] dp = new long[N+1][2];
// 1 자리일 때
dp[1][0] = 0; // 뒷자리가 0으로 끝나는 이친수
dp[1][1] = 1; // 뒷자리가 1로 끝나는 이친수
for(int i=2;i<N+1;i++) {
// 뒷자리가 0으로 끝나는 경우 0,1 붙이기
dp[i][0] = dp[i-1][0] + dp[i-1][1];
// 뒷자리가 1로 끝나는 경우 0 붙이기
dp[i][1] += dp[i-1][0];
}
System.out.println(dp[N][0] + dp[N][1]);
}
}
'코딩테스트' 카테고리의 다른 글
[백준] 11866번 : 요세푸스 문제0 자바(JAVA) 풀이 (0) | 2024.10.25 |
---|---|
[백준] 2303번 : 숫자 게임 자바(JAVA) 풀이 (1) | 2024.10.22 |
[백준] 5567번 : 결혼식 자바(JAVA) 풀이 (0) | 2024.10.17 |
[백준] 2204번 : 도비의 난독증 테스트 자바(JAVA) 풀이 (0) | 2024.09.26 |
[백준] 2644번 : 촌수 계산 자바(JAVA) 풀이 (0) | 2024.09.26 |