1. 문제설명
2xn 직사각형을 1x2, 2x1, 2x2 타일로 채우는 방법의 수를 10,007로 나눈 나머지를 구하는 문제이다.
- 시간 제한: 1초
- 메모리 제한: 256MB
2. 접근 방식
- `dp[i]`에 가로 길이가 i일 때 채우는 방법의 수를 저장한다.
- `dp[i] = dp[i-1] + dp[i-2] * 2`
- `dp[1]`과 `dp[2]`는 초기값 설정하고, i=3 부터는 점화식을 사용해 값을 구한다.
3. 틀린 이유
`dp[i]` 에 값을 저장할 때 점화식 계산한 값을 그대로 넣었더니 데이터 타입을 초과해서 틀렸다.
4. 틀린 부분 수정
저장할 때 `% 10007` 연산으로 10007 이하로 값을 저장했다.
5. 최종 코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] dp = new int[1001]; // dp 배열의 크기를 1001로 설정
// 초기값 설정
dp[1] = 1; // 2x1 직사각형을 채우는 방법의 수
dp[2] = 3; // 2x2 직사각형을 채우는 방법의 수
for(int i=3; i<=n; i++) {
// 점화식을 이용해 배열 채우기
dp[i] = (dp[i-1] + dp[i-2] * 2) % 10007;
}
System.out.println(dp[n]);
}
}
6. 느낀점 or 기억할정보
dp 배열에는 문제에서 주어지는 최대값으로 크기 설정하기!
아직 점화식을 추출해내는 것이 어렵다..
반응형
'알고리즘 문제 > 백준' 카테고리의 다른 글
[백준] 1463번: 1로 만들기 (Java) (1) | 2024.08.28 |
---|---|
[백준] 2839번: 설탕 배달 (Java) (0) | 2024.08.28 |
[백준] 9655번: 돌 게임 (Java) (0) | 2024.08.27 |
[백준] 9095번: 1,2,3 더하기 (Java) (0) | 2024.08.26 |
[백준] 1010번: 다리 놓기 (Java) (0) | 2024.08.26 |
댓글