[Swift] 백준 11726번: 2×n 타일링

Lee Youjin·2023년 7월 15일
0

Swift로 백준 풀기

목록 보기
11/12
post-thumbnail

문제

2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.

입력

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

출력

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

접근

처음에는 팩토리얼을 써서 풀어보려고 했다. 너비가 2인 타일의 개수를 for문을 이용해 점점 증가시키며 구하고, 그에 맞는 너비가 1인 타일의 개수를 구한 후 같은 것이 있는 순열을 이용해 result에 더해주는 식으로 풀었는데 런타임 에러가 났다.
다시 찾아보니 수가 커지면 Int 범위를 벗어나기 때문에 런타임 에러가 난다고 한다. 애초에 팩토리얼을 써서 풀면 시간 초과가 나는데 런타임 에러가 나 준 덕분에 삽질을 초기에 멈출 수 있었다 (...)
질문 게시판에서 추천받은 대로 메모이제이션을 활용해서 풀었다. 메모이제이션을 활용해서 풀 때 주의할 점은 밑 코드를 보면 알겠지만 for문을 돌릴 때 i가 3부터 시작하기 때문에 n이 1이나 2일 때 예외를 처리해줘야 한다.
이거 안해서 한 번 더 틀렸다
ㅇㄴ

코드

import Foundation

var n = Int(readLine()!)!
var memo = [Int](repeating: -1, count: 1001)


if n == 1 { print(1) }
else if n == 2 { print(2) }
else {
    memo[1] = 1
    memo[2] = 2
    
    for i in 3...n { memo[i] = ((memo[i - 2] % 10007) + (memo[i - 1] % 10007)) % 10007 }

    print(memo[n])
}

ㅠㅠ 한번 안쓰기 시작하니 너무너무 귀찮아지는군
으아악 써야한다! 써야한다!

profile
꾸준히 발전하고 있습니다.

0개의 댓글