꾸물꾸물 졔의 개발공부

백준 1904 - 01타일 ( JAVA ) 본문

알고리즘/백준

백준 1904 - 01타일 ( JAVA )

체제 2023. 2. 13. 17:44

출처 - 백준 알고리즘

 

1904번: 01타일

지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이

www.acmicpc.net


 

알고리즘

{ 00, 1 } 을 사용하여 수열을 만들어야 할 때, 각 원소로 시작하는 수열을 만든다고 생각해보자. 

 

N= 1 일 경우, [1]

N= 2 일 경우, [00, 11] 

N= 3 일 경우, [001, 111, 100] 

N= 4 일 경우, [0000, 0011, 1001, 1100, 1111] 

... 

 

N의 값이 1, 2일 경우를 제외하고는 00으로 시작하는 수열의 갯수 + 1로 시작하는 수열의 갯수인 것을 알 수 있다. 

즉, N-2(=00) 길이의 수열 갯수 + N-1(=1) 길이의 수열 갯수 인 것이다. 

 

이전의 작은 값들(N-1, N-2)을 저장하여 하나의 큰 값(N)을 구하는 다이나믹 프로그래밍 DP 를 사용한다. 

길이가 N인 모든 2진 수열의 갯수를 dp[] int 형 배열에 저장 했을 때, dp[N] = dp[N-2] + dp[N-1] 이다. 

단, N 이 3 이상일 때만 !!

 

 

+ 신경써야 할 부분 

1.  dp에 저장하는 과정은 N= 3일 때 부터 저장하므로, N<3 일경우에는 런타임 에러에 주의 !! 

2.  각 길이에 대해 길이가 N 인 수열의 갯수를 15764 으로 나눈 나머지를 저장해야 한다. 

 


 

소스 코드 

import java.util.*;

public class Solution_BaekJoon_1904 {
	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in); 
		int N= sc.nextInt(); // 지원이가 만들 수 있는 길이 
		
		int dp[] = new int[N+1];
		
		//런타임 에러 주의 ! 
		if(N<3) {
			System.out.println(N);
			return; 
		}
	
		dp[1] = 1; // N=1일때는 0: 1개
		dp[2] = 2; // N=2일때는 00, 11 : 2개 		
		for(int i=3; i<=N; i++) {
			dp[i] = (dp[i-1]+dp[i-2])%15746; 
		}

		System.out.println(dp[N]);
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 5904 - Moo 게임 ( JAVA )  (0) 2023.02.18
백준 1932 - 정수 삼각형 ( JAVA )  (1) 2023.02.16
백준 1107 - 리모컨 ( JAVA )  (0) 2023.02.10
백준 1900 - 레슬러 ( JAVA )  (0) 2023.02.09
백준 9251 - LCS ( JAVA )  (0) 2023.02.06