[boj] (s3) 1904 01타일

강신현·2022년 4월 20일
0

✅ DP

문제

링크

1. 문제 접근 및 해결 로직

지원이가 만들 수 있는 길이가 N인 모든 2진 수열의 개수를 15746으로 나눈 나머지를 출력하라는거 보니 경우의 수가 굉장히 많다는걸 예상할 수 있다.
따라서 완전탐색으로는 풀 수 없어 DP를 생각해봤다.

00 과 1 타일을 사용하기 때문에 n번째 타일은
1. (n-2)에 0 -> (n-1)도 0 -> (n) 은 1 만 가능
=> (n-2)에 의해 결정
2. (n-2)에 1 -> (n-1)은 0 or 1 둘 다 가능 -> (n)은 n-1에 무엇을 놓았느냐에 따라 결정
=> (n-1)에 의해 결정

따라서 n번째 타일은 n-2에 의해 결정되는 경우가 1가지, n-1에 의해 결정되는 경우가 1 가지 있다.

  • 정의
    f(N)f(N) : 만들 수 있는 길이가 N인 모든 2진 수열의 개수
  • 구하는 답
    f(N)f(N)
  • 초기값
    f(1)=1f(1)=1
    f(2)=2f(2)=2
  • 점화식
    f(N)=f(N1)+f(N2)f(N)=f(N-1)+f(N-2)

2. 코드

3. 시간 복잡도 분석

경우의 수를 모두 구하므로
O(N)O(N)

4. 문제에서 중요한 부분

DP문제는 점화식을 도출하는 것이 중요하다.
Bottm Up(반복문)으로 풀지 Top Down(재귀)으로 풀지는 선택사항

profile
땅콩의 모험 (server)

0개의 댓글