6개의 댓글이 있습니다.
-
-
WeissBlume -
행렬의 빠른 제곱을 이용하는 접근은 옳은데, 점화식이 틀린 것 같네요.저는 n=4일 때 23이 나옵니다.
8년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
행렬의 빠른 제곱을 이용하는 접근은 옳은데, 점화식이 틀린 것 같네요.저는 n=4일 때 23이 나옵니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
yhtgogo
TILING
이 문제를 해결하려고 별짓을 조금 해봤습니다.
각 타일의 갯수에 따르는 패턴을 발견해서
아래와 같은 점화식을 도출해 냈습니다.
F(N) = F(N-1) * 1 + F(N-2) * 2 + F(N-3) * 5
그런데요.
테스트케이스는 30000개까지에
입력이 되는 N의 상한선이 10억이므로
완전탐색으로 재귀적인 구현은 시간내에 불가능하구요.
동적계획법을 이용하는 방법도 시간내에 불가능해 보였어요.
3000만개의 테스트케이스를 위해 매번 재계산 할필요 없이
10억개를 미리 깔아놓는 것도 시간내에 할짓은 아닌 것 같았어요.
그래서 점화식의 매트릭스 특징을 발견하려고 애썼습니다.
종이에 끄적끄적 거리면서 이면지 한 다발 써가면서
혹시 GGGCCCDDD 의 방법처럼 될런지 하면서 말이죠.
몇번의 삽질을 통해 마침내
[ 1 2 5 ] [F(N-1)] = [F(N)]
[ 1 0 0 ] [F(N-2)] = [F(N-1)]
[ 0 1 0 ] [F(N-3)] = [F(N-2)]
이렇게 3X3 행렬식을 만들게 되었습니다.
여기서 2^0 부터 2^30 까지 2의 승수별로 행렬식을 미리 깔아놓고
항등행렬에서부터 행렬식을 곱해주면서 답을 찾아내도록 했습니다.
이렇게 되면 테스트케이스별로
3 X 3 행렬식 최대 31개를 곱하게 되어
3 X 3 X 3 X 31 = 837번의 정도 연산이 됩니다.
대충 30,000 X 900 이면 27,000,000 이 되네요.
10억보단 훨씬 적어서 시간내에 도달할 것 같습니다.
이제 구현을 하고나서
예제 케이스에서부터 엑셀이 계산할 수 있는
어느정도는 맞춰봤는데요.
오답이 나와서 좀 뭔가 변화가 필요한 것이 아닌지 궁금합니다.
시간내에 할 수는 있을 것이지만 뭔가 2%가 부족한것이 무엇인지요....
나이가 많은 것은 아닌데 머리가 안돌아가요. ㅠㅠ
힌트라도 좀 주셨으면 좋겠습니다.^^
8년 전