백준 : 2 x n 타일링2(11727) with 파이썬
https://www.acmicpc.net/problem/11727
11727번: 2×n 타일링 2
2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.
www.acmicpc.net
문제
2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×17 직사각형을 채운 한가지 예이다.
입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
예제 입력 1 복사
2
예제 출력 1 복사
3
예제 입력 2 복사
8
예제 출력 2 복사
171
예제 입력 3 복사
12
예제 출력 3 복사
2731
문제풀이
이 문제를 풀기 위해선 규칙을 찾아야 한다.
규칙을 찾기 위해서 n=1 ~ n=4까지 대입해여 직관적으로 보기위해 도형으로 그려보겠다.
n = 3일경우 n = 1일 때의 도형과 n = 2일 때의 도형을 포함하는 것을 볼 수있다.
밑에 n = 4일 때의 그림을 보면 마찬가지로 n = 2일 경우와 n = 3일 경우의 도형을 포함하는 것을 볼 수있다.
따라서 다음 그림을 보면 규칙성을 존재하는 것을 확인할 수 있는데 이를 식으로 표현하면
n = i일 경우 [n - 1] * 2 + [n - 2]라는 점화식을 세울 수 있다.
코드 하나하나 설명 들어갑니다.
sys 모듈 : 시스템과 관련된 함수와 변수들을 제공하여 파이썬 프로그램이 운영 체제와 상호 작용하고 정보를 얻을 수 있게 도와줍니다.
sys.stdin : sys 모듈 내에 있는 표준 입력 스트림을 나타내는 객체입니다. 표준 입력 스트림은 사용자가 키보드로 입력하는 데이터를 읽어오는 용도로 사용됩니다.
sys.stdin.readline : 표준 입력 스트림에서 한 줄을 읽어오는 함수입니다. 이 함수를 호출하면 사용자가 입력한 데이터 중에서 한 줄을 읽어와 문자열로 반환합니다. 입력이 없을 때까지 기다릴 수 있습니다.
먼저 n에 입력값을 받습니다.
그리고 dp 객체를 생성하여 초기화하고 범위가 1 <= n <= 1000 이라고 했으므로 범위만큼 지정해줍니다.
dp[0], dp[1] = 1로 먼저 정의를 해줍니다.
* 위 코드에서 dp[2] = 3은 생략해도 되지만 코드가 돌아가는 시간을 줄이기 위해 하나 더 추가해 주었습니다.
반복문을 사용해서 앞에서 정의한 부분을 제외하고 dp[i]의 값을 찾습니다.
dp[i]를 찾는 방법은 전값 + 전전값 * 2라고 했으므로 코드로 그대로 구현하면 됩니다.
마지막으로 출력 부분인데 문제에서 정의된 내용이 10007로 나눈 나머지 값을 출력하라고 했으므로 그대로 dp[n]에서 %10007을 해줍니다.
그러면 타일을 채우는 방법의 수를 구하는 프로그램이 잘 동작할 것입니다.