-
[Baekjoon Online Judge] 2193번: 이친수문제 풀이/Baekjoon Online Judge 2021. 2. 2. 21:57
요구사항
- 0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수라 한다.
- 이친수는 0으로 시작하지 않는다.
- 이친수는 1이 두 번 연속 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.입력
- 첫째 줄에 N이 주어진다. N(1 ≤ N ≤ 90)
출력
- 첫째 줄에 N자리 이친수의 개수를 출력한다.
우선 간단한 규칙을 찾기 위해서 N의 범위에 맞춰 만족하는 이친수의 개수를 세보았다.
N 자리 이친수 이친수의 개수 1 1 1 2 10 1 3 100, 101 2 4 1000, 1001, 1010 3 5 10000, 10001, 10010, 10100, 10101 5 6 ... 8? 이친수의 개수에 대한 규칙을 찾아보니 쉽게 피보나치 수인 것을 알 수 있었다.
한가지 더 고려해야 할 점은 N은 최소 1 부터 최대 90 자리를 가질 수 있기 때문에 자리수가 커질 수록 이친수의 개수는 기하급수적으로 늘어날 것으로 예상했다. 그렇기 때문에 dp 테이블의 데이터 타입을 long으로 코드를 작성하였다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class Baekjoon2193 { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out)); int n = Integer.parseInt(bufferedReader.readLine()); long[] dp = new long[n + 1]; for (int i = 1; i <= n; i++) { if (i == 1 || i == 2) dp[i] = 1; else dp[i] = dp[i - 1] + dp[i - 2]; } bufferedWriter.write(String.valueOf(dp[n])); bufferedWriter.flush(); bufferedReader.close(); bufferedWriter.close(); } }
규칙을 찾으면 쉽게 해결할 수 있는 문제였다.
'문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon Online Judge] 11656번: 접미사 배열 (0) 2021.02.05 [Baekjoon Online Judge] 10988번: 팰린드롬인지 확인하기 (0) 2021.02.05 [Baekjoon Online Judge] 2156번: 포도주 시식 (0) 2021.02.02 [Baekjoon Online Judge] 2748번: 피보나치 수 2 (0) 2021.02.01 [Baekjoon Online Judge] 1932번: 정수 삼각형 (0) 2021.02.01