Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- BOJ
- mybatis
- java
- db
- spring
- database
- 플라스크
- 웹프로그래밍
- sql
- 오라클
- TIL
- javascript
- rdbms
- flask
- mysql
- 자바
- 데이터베이스
- 링크
- 에러
- Git
- Oracle
- eclipse
- 파이썬
- 이클립스
- PYTHON
- 백준
- jQuery
- 스프링
- 자바스크립트
- 알고리즘
Archives
- Today
- Total
기록과 정리의 공간
[알고리즘] 백준 1904번 : 01타일 본문
백준 1904번 : 문제집 (문제 링크)
- 사용 언어 : 파이썬(Python)
- 문제 유형 : 동적 프로그래밍
- 난이도 : 하
소스코드
- 주의 : 아래에서 cache를 [0] * 1000001가 아니라 cache = [0] * (n+1)으로 작성하면 n=1 일 때, cache = [0, 0]이므로 cache[2] = 2 에서 IndexError가 발생한다.
import sys
n = int(sys.stdin.readline())
cache = [0] * 1000001
cache[1] = 1
cache[2] = 2
for i in range(3, n+1):
cache[i] = (cache[i-2] + cache[i-1]) % 15746
print(cache[n])
설명
- 동적 프로그래밍문제의 가장 기본적이면서, 전형적인 문제이다. (반드시 알아두기!)
- n이 최대 1,000,000이므로, O(n)시간으로 해결해야 한다.
- n=1일 때 => 1로 한 가지, n=2일 때 => 11, 00로 두 가지 만들기 가능.
- 타일을 오른쪽에서 부터 이어 붙인다고 할 때, 길이가 i인 수열을 형성하는 방법은 아래 두 가지 뿐이다.
- 예를 들어, n=3인 수열을 만들고자 한다.
- 이미지와 같이 맨 끝이 1일 때 그 앞에 길이가 i-1 = 2인 수열(11, 00)을 이어 붙이면 111, 001
- 이미지와 같이 맨 끝이 00일 때 그 앞에 길이가 i-2 = 1인 수열(1)을 이어 붙이면 100. 총 3가지 수열을 만들 수 있다.
- 결국 ai가 수열의 길이가 i일 때 만들 수 있는 수열의 개수라고 하면, a3 = a1 + a2라는 식을 세울 수 있다.
- 즉, ai = ai-2 + ai-1 이 되는 것이다. 이 문제는 결국 피보나치 수열과 동일한 문제이다.
'문제풀이 > 백준(BOJ)' 카테고리의 다른 글
[알고리즘] 백준 11053번 : 가장 긴 증가하는 부분 수열 (0) | 2020.08.08 |
---|---|
[알고리즘] 백준 12865번 : 평범한 배낭 (0) | 2020.08.06 |
[알고리즘] 백준 1766번 : 문제집 (0) | 2020.08.05 |
[알고리즘] 백준 1991번 : 트리 순회 (0) | 2020.07.17 |
[알고리즘] 백준 2212번 : 센서 (4) | 2020.07.17 |
Comments