Algorithm
백준 2193번 <이친수>
seungh2
2022. 4. 27. 00:23
백준 알고리즘 2193번
https://www.acmicpc.net/problem/2193
2193번: 이친수
0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않
www.acmicpc.net
2193번
이친수는 이진수 중 아래의 조건을 만족하는 수이다.
- 0으로 시작하지 않는다.
- 1이 두 번 연속 나타나지 않는다.
n자리 이친수의 개수를 구하여라.
입력으로 첫 줄에 n이 주어진다.
출력으로 n자리 이친수의 개수를 출력하면 된다.
문제 해결
다이나믹 프로그래밍으로 해결할 수 있다.
먼저 dp 배열을 2개 만들었다.
zero[i] : i자릿수 이친수 중 0으로 끝나는 개수
one[i] : i자릿수 이친수 중 1으로 끝나는 개수
1이 두 번 연속 나타나지 않기 때문에 one[i] = zero[i-1]이다.
0은 두 번 연속 나타날 수 있기 때문에 zero[i] = zero[i-1] + one[i-1]
zero[0]과 zero[1]은 먼저 채운다. 마찬가지로 one[0]과 one[1]은 먼저 채운다.
또한 n=1일 수도 있기 때문에 조건문으로 처리한다.
코드
package bj2193;
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[] zero = new long[n+1];
long[] one = new long[n+1];
if(n == 0) {
System.out.println(1);
}else {
zero[0] = 0;
zero[1] = 0;
one[0] = 0;
one[1] = 1;
for(int i = 2; i < n+1; i++) {
zero[i] = zero[i-1] + one[i-1];
one[i] = zero[i-1];
}
System.out.println(zero[n] + one[n]);
}
}
}
결과
이친수의 개수가 int 자료형을 넘어갈 수 있기 때문에 long 자료형을 사용해야 한다.
728x90