문제를 잘 읽고 푸는 방법을 생각하는 연습을 좀 해야겠다.
마지막에 어떤 수가 올 수 있는지 생각하는 것이 중요하다는 걸 깨달았다.
이문제 같은 경우에는 마지막이 항상 세로 타일 1개 또는 가로 타일 2개가 올 수 있다.
세로 타일이 왔을 경우는 세로 타일의 길이를 제외하면 n-1,
가로 타일이 왔을 경우는 가로 타일의 길이를 제외하면 n-2 이다.
마지막에 올 수 있는 타일의 형태에 따라 앞의 n-1 또는 n-2의 타일의 경우의 수는
앞에 구해놓은 dp에서 가져오면 된다.
따라서 점화식을 dp[n] = dp[n-1] + dp[n-2] 로 만들 수 있다.
참 이해하기 힘든 것 같다.
출력은 10,007을 나머지 한 값을 출력하면 되는데
dp를 구해놓고 마지막 출력할때 %연산을 해주면 어김없이 '틀렸습니다.'로 채점된다.
이유는 dp에 넣어주는 과정에서 오버플로우가 발생한다고 한다.
그래서 dp[i]에 값을 넣어줄 때 %연산을 해줘야 정답으로 인정된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int [] dp = new int[n+1];
dp[1] = 1;
if(n>=2)
dp[2] = 2;
for(int i=3; i<=n; i++)
dp[i] = (dp[i-1]+dp[i-2]) % 10007 ;
System.out.println(dp[n]);
}
|
'Algorithm' 카테고리의 다른 글
백준 2193 이친수 Java (1) | 2019.04.10 |
---|---|
백준 9095 1, 2, 3 더하기 Java (0) | 2019.04.09 |
백준 1463 1로만들기 Java (2) | 2019.04.09 |
백준 1406 에디터 Java (0) | 2019.04.08 |
백준 10799 쇠막대기 Java (2) | 2019.04.08 |