문제분석
문제는 아주 심플하다. 가로 2 세로 1인 블록을 3XN타일에 몇개까지 완벽하게 가득 넣을수 있는지 묻는다.
문제 읽자마자 떠오르는게 '규칙찾기' 이다.
혹여나, 규칙을 찾으신분은 별탈 없이 이문제는 프리패스지만.. 못찾는게 대부분이다.
규칙을 찾기위해선 먼저 증거들을 수집해 보자.
n=0 , 1
n=2 , 3
n=4 , 11
-> 홀수를 빼먹엇는데 홀수의 경우수는 완벽하게 가득 넣을수없으니 0개다.
저 3가지의 경우를 보고 규칙이 보이는가? 대부분 못찾는다..
n=6일땐 경우의수가 41이나온다. n=6인 예시도 있었다면 규칙을 쉽게찾앗겟지만 주지않는다.
만약 실제 코딩테스트문제라면 빠른 구글링을하자.,, 괜히 규칙찾는다고 시간낭비다.
필자도 고민해보다 구글링을 했는데,
규칙은 f(n)= f(n-2)*4 - f(n-4) 가 나온다.
이 하향식 규칙을 사용하려면 모듈러 분배규칙을 사용해야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Solution {
long[] tile = new long[5001];
public long solution(int n) {
long answer = 0;
int mod=1000000007;
//1:2, 2:3, 3:6 4:11
// 규칙활용 f(n) = f(n-2)*4 - f(n-4)
tile[0]=1;
tile[2]=3;
//f(n) = ((f(n - 2) x 4 % 1,000,000,007)
//- (f(n - 4) % 1,000,000,007) + 1,000,000,007) % 1,000,000,007
for(int i=4; i<=n; i+=2){
tile[i]= (tile[i-2]*4%mod -tile[i-4]%mod +mod)%mod;
};
return answer=tile[n];
}
}
|
cs |
이 코드도 잘 동작한다.
또다른 규칙은 이런 규칙도있다.
dp[i] = dp[i-2] * 3 (i>=4, 2씩 증가)
dp[i] += dp[j] * 2 (j <= i-4, 2씩 차감) 이다.
만약 규칙이 구해지는 과정을 보고싶다면 아래 블로그에서 설명을 잘해준다.
https://s2choco.tistory.com/24
프로그래머스 - 3xn 타일링 풀이 (python3)
프로그래머스 3xn 타일링의 문제 설명은 여기서 볼 수 있고 풀어볼 수도 있다. 이전에 2xn 타일링 문제를 풀어봤기 때문에 3n 타일링 문제에 도전해보았다. 원리는 비슷하고 조금 응용하면 되겠지.
s2choco.tistory.com
규칙을 알앗다면 바로 적용해보자!
문제풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class Solution {
long[] tile = new long[5001];
public long solution(int n) {
long answer = 0;
int mod=1000000007;
tile[0]=1;
tile[2]=3;
for(int i=4; i<=n; i+=2){
tile[i] = tile[i-2] * 3;
for(int j=i-4; j>=0; j-=2){
tile[i] += tile[j] * 2;
}
tile[i] = tile[i] % mod;
};
return answer=tile[n];
}
}
|
cs |
'알고리즘 > 프로그래머스 Level2' 카테고리의 다른 글
[프로그래머스 , 자바] Level2: N-Queen (0) | 2022.07.03 |
---|---|
[프로그래머스,자바] Level2: 하노이의 탑 (0) | 2022.07.02 |
[프로그래머스,자바] Level2: 이진 변환 반복하기 (0) | 2022.02.23 |
[프로그래머스,자바] Level2: 캐시 (0) | 2022.02.21 |
[프로그래머스 , 자바] Level2: 주식가격 (0) | 2022.02.20 |