본문 바로가기
공부 정리/백준

[백준] 자바 2193 이친수

by 경적필패. 2021. 7. 30.
반응형

문제

0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친 수(pinary number)라 한다. 이친 수는 다음의 성질을 만족한다.

  1. 이친 수는 0으로 시작하지 않는다.
  2. 이친 수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다.

예를 들면 1, 10, 100, 101, 1000, 1001 등이 이친 수가 된다. 하지만 0010101이나 101101은 각각 1, 2번 규칙에 위배되므로 이친 수가 아니다.

N(1 ≤ N ≤ 90)이 주어졌을 때, N자리 이친수의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다.

출력

첫째 줄에 N자리 이친수의 개수를 출력한다.


테스트 케이스

90
2880067194370816120

 

1
1

 

60
1548008755920

 


접근

이친수 규칙에 의해 만들어지는 수들을 0으로 끝나는 수와 1로 끝나는 수와 나누어 보았습니다.

 

1번째 값의 경우 1   ->   1의개수 1/    0의 개수 0

2번째 값의 경우 10   ->   1의개수 0/    0의 개수 1

3번째 값의 경우 101,100   ->   1의개수 1/    0의 개수 1

4번째 값의 경우 1010,1001,1000   ->   1의개수 1/    0의 개수 2

이 값들을 표로 만들어 보면

dp 1의개수 0의개수
1 1 0
2 0 1
3 1 1
4 1 2
5 2 3
6 3 5

 

하다보면 1의 개수와 0의 개수의 합이 다음 dp의 0의 개수임을 알 수 있고, 현재 0의 개수가 다음 dp의 1의 개수라는 것이라는 규칙을 알 수 있습니다.

이를 통해 구현하니 문제가 해결되었습니다.


코드

import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;

public class Main {

	/*
 	 2193 problem
	*/
	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int num = Integer.parseInt(br.readLine());
		ArrayList<Long> one = new ArrayList<>();
		ArrayList<Long> zero = new ArrayList<>();
		one.add((long) 1);
		zero.add((long) 0);
		for(int i=1; i<=num; i++) {
			one.add(zero.get(i-1));
			zero.add(zero.get(i-1)+one.get(i-1));
		}
		
		bw.write(String.valueOf(zero.get(num)));
		bw.flush();
		bw.close();
	}
	
}

주의

int로 하면 오버플로우가 발생하므로 long타입을 사용해줘야합니다

 

반응형

'공부 정리 > 백준' 카테고리의 다른 글

[백준] 자바 1260 DFS와 BFS  (0) 2021.08.03
[백준] 자바 9625 BABBA  (0) 2021.08.02
[백준] 자바 9656 돌 게임 2  (0) 2021.07.29
[백준] 자바 13301 타일 장식물  (0) 2021.07.28
[백준] 자바 2156 포도주 시식  (0) 2021.07.27

댓글