일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
Tags
- 합 구하기
- DP
- appendleft
- 1일1솔
- 완전탐색
- C#강의
- 소수판별
- BFS
- 인프런
- 소수찾기
- 백준
- 연관관계
- Java
- popleft
- pypy3
- 누적합
- JPA
- python3
- spring
- deque
- LCM
- 프로그래머스
- 그리디 알고리즘
- unity
- Python
- 우선순위큐
- mvc
- 브루투포스
- 파이썬
- c#
Archives
- Today
- Total
jae_coding
(백준 알고리즘 문제풀이) 1904번 01타일 본문
반응형
문제
문제 접근
- 0, 1이 쓰여진 낱장의 타일 -> 00, 1 이 쓰여진 낱장의 타일
goal: N이 주어졌을 때, 가질 수 있는 모든 가짓수
output: 길이가 N인 모든 2진 수열의 개수를 15746으로 나눈 나머지 - N의 개수
1(1): 1
2(2): 00, 11
3(3): 001, 100, 111
4(5): 0011, 0000, 1100, 1111, 1001
5(8): 00001, 10000, 11100, 11111, 10011, 11001, 00100, 00111 - 점화식
An = A(n-2) + A(n-1)
코드
메모리 초과 코드
import sys
sys.setrecursionlimit(10**6)
def fib(N, memo):
if N == 1:
return 1
elif N == 2:
return 2
else:
if N not in memo:
memo[N] = (fib(N-2, memo) + fib(N-1, memo)) % 15746
return memo[N]
else:
return memo[N]
N = int(sys.stdin.readline())
memo = dict()
result = fib(N, memo)
print(result)
통과 코드
import sys
N = int(sys.stdin.readline())
tile = [0] * 1000001
tile[1] = 1
tile[2] = 2
for i in range(3, N+1):
tile[i] = (tile[i-2] + tile[i-1]) % 15746
print(tile[N])
느낀점
점화식의 형태가 피보나치형으로 나와서 dictionary와 recursive 함수를 사용하기로 먼저 생각을 했었다. 하지만 메모리 초과 문제로 인하여 리스트의 개수를 문제에 맞게 한정적으로 변경을하고 리스트 안에 들어가는 int형이 클수록 메모리가 많이 들어가기 때문에 저장할 때부터 15746을 나누어 줌으로써 메모리 문제를 해결할 수 있었다. 어떠한 코드를 작성하더라도 메모리를 효율적으로 사용할 수 있는 방법을 생각해봐야겠다.
반응형
'알고리즘 문제 > 백준' 카테고리의 다른 글
(백준 알고리즘 문제풀이) 1465번 스티커 (0) | 2022.07.06 |
---|---|
(백준 알고리즘 문제풀이) 12865번 평범한 배낭 (0) | 2022.07.06 |
(백준 알고리즘 문제풀이) 11052번 카드 구매하기 (0) | 2022.07.05 |
(백준 알고리즘 문제풀이) 10057번 오르막 수 (0) | 2022.07.05 |
(백준 알고리즘 문제풀이) 1010번 다리 놓기 (0) | 2022.07.05 |
Comments