티스토리 뷰

Problem Solving

[ 백준 1904 ] 01타일 ( Java )

hoony__93 2020. 12. 15. 17:05
728x90
반응형

 

문제 링크

https://www.acmicpc.net/problem/1904

 

1904번: 01타일

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

www.acmicpc.net

문제 풀이

점화식 문제이고, 동적 프로그래밍 방법을 알면 쉽게 풀 수 있는 문제입니다.

차근차근 a1부터 써보면 값을 예측할 수 있습니다.

a1 = 1;

a2 = 2;

a3 = a1 + a2 = 3;

a4 = a2 + a3 = 5;

...

 

어떻게 이렇게 나오게 되는지 알아보겠습니다.

예를들어 a5의 경우를 보겠습니다.

 

1. a5는 맨 앞에 00이 오거나 1이 오게 됩니다.

2-1. 00이 오게되면 나머지 3자리는 a3와 같은 수열로 채워집니다.

2-2. 1이 오게되면 나머지 4자리는 a4와 같은 수열로 채워집니다.

3. a3+a4를 하게되면 a5의 값을 구할 수 있습니다.

 

이문제는 단순 재귀로 풀게되면 시간이 너무 오래 걸리기 때문에 동적 프로그래밍을 사용해야 합니다.

그리고, 탑다운 방식(재귀)으로 풀게 되면 스택오버플로우가 나기 때문에 바텀업 방식(반복문)을 이용하여 푸는 것이 쉽습니다.

 

 

소스 코드
import java.util.*;
public class Main {
	static long [] memo;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		memo = new long[n+1];
		for (int i = 0; i <= n; i++) {
			if( i ==0 || i ==1 || i==2) memo[i] = i;
			else memo[i] = (memo[i-1] + memo[i-2])%15746;
		}
		System.out.println(memo[n]);
	}
}
728x90
반응형
250x250
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함