https://www.acmicpc.net/problem/1904
1904번: 01타일
지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이의 공부를 방해하기 위해 0이 쓰여진 낱장의 타일들을 붙여서 한 쌍으로 이루어진 00 타일들을 만들었다. 결국 현재 1 하나만으로 이루어진 타일 또는 0타일을 두 개 붙인 한 쌍의 00타일들만이 남게 되었다. 그러므로 지원이는 타일로 더 이상 크기가 N인 모든 2진 수
www.acmicpc.net
위의 문제는 BaekJoon Online Judge의 단계별로 풀어보기 중 14단계
동적 계획법 1의 카테고리에 포함되어 있는 문제이다.
길이가 증가할 때마다 2진 수열의 개수도 늘어난다.
1, 2, 3, 5, 8, ...
식을 구해보면 A(n) = A(n-2) + A(n-1)이라는 식이 나오게 된다.
A(n)은 A(n-2)의 값에 00타일을 붙이고 A(n-1)의 값에 1타일을 붙이는 경우로 계산한다.
예). A(3)의 값 : A(1)의 값인 1에 00을 붙임 = 100, A(2)의 값인 00과, 11에 1을 붙임 = 001, 111
A(3) = 100, 001, 111
출력을 보면 수열의 개수를 15746으로 나눈 나머지를 출력한다고 나와있다.
문제의 핵심은 나머지를 나중에 하면 숫자의 범위가 초과된다는 것이다.
N의 자리수가 1,000,000까지인데 저 수열의 항이 100번째만 되어도 수가 기하 급수적으로 늘어나기 때문에
나는 계산하면서 바로바로 나머지연산을 해주었다.
import java.util.Scanner;
public class Question_1904 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] Cal = new int[N+1];
Cal[1] = 1;
if(N != 1)
Cal[2] = 2;
for(int i = 3; i < N + 1; i++) {
Cal[i] = (Cal[i-2] + Cal[i-1])%15746;
}
System.out.println(Cal[N]);
}
}
'BaekJoon' 카테고리의 다른 글
[백준] 9095번 : 1, 2, 3 더하기(JAVA) (0) | 2019.12.01 |
---|---|
[백준] 9461번 : 파도반 수열(JAVA) (0) | 2019.12.01 |
[백준] 2108번 : 통계학(JAVA) (0) | 2019.11.30 |
[백준] 1003번 : 피보나치 함수(JAVA) (0) | 2019.11.28 |
[백준] 3036번 : 링(JAVA) (0) | 2019.11.28 |
댓글