forked from satnaing/astro-paper
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Affected files: .obsidian/workspace.json src/content/blog/boj-1309-동물원.md
- Loading branch information
Showing
2 changed files
with
70 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
--- | ||
author: Gyunseo Lee | ||
title: Hello, World! | ||
pubDatetime: 2024-07-06T17:16:00+09:00 | ||
modDatetime: 2024-07-06T17:16:00+09:00 | ||
featured: false | ||
draft: false | ||
tags: | ||
- PS | ||
- BOJ | ||
- Algorithms | ||
- DP | ||
description: 개수를 세다가 이전에 세었던 걸 다시 이용하면 DP를 의심해 보자 | ||
ogImage: "" | ||
--- | ||
|
||
## Table of contents | ||
|
||
## 들어가며 | ||
|
||
걸린 시간: 24분 | ||
|
||
처음 문제를 읽고, 사자를 우리에 가두는 경우의 수를 태블릿에 그려 가면서 세어 봤습니다. | ||
세다 보니 이전에 미리 세었던 가지수가 새로 가지수를 셀 때 필요가 하더이다... | ||
그래서 DP로 접근을 했습니다. | ||
키보드에 먼저 손을 올리기 보다는 규칙을 찾고, 점화식을 세우기 시작했습니다. | ||
|
||
## 접근 | ||
|
||
![](https://res.cloudinary.com/gyunseo-blog/image/upload/f_auto/v1720254092/image_naizbz.png) | ||
점화식은 위의 필기에 나온 대로 였습니다. | ||
0은 세로 길이가 n인 우리에서 그 어떤 곳에도 사자를 집어 넣지 않을 때의 경우의 수를 나타내는 dp 테이블의 column입니다. | ||
dp(n, k): 세로 길이가 n인 우리에서 가로 길이가 k인 우리에 사자를 넣는 경우의 수 (단, k가 0이면 세로 길이가 n인 우리들 중에 그 어떤 곳에도 사자를 넣지 않는 경우의 수) | ||
그래서 해당 점화식을 기반으로 구현을 했습니다. | ||
|
||
## 구현 | ||
|
||
```python | ||
import sys | ||
|
||
input = sys.stdin.readline | ||
|
||
if __name__ == "__main__": | ||
MOD = 9901 | ||
N = int(input().strip()) | ||
dp = [[0 for __ in range(3)] for _ in range(N + 1)] | ||
dp[1][0] = dp[1][1] = dp[1][2] = 1 | ||
for i in range(2, N + 1): | ||
dp[i][0] = sum(dp[i - 1]) | ||
dp[i][0] %= MOD | ||
for j in range(1, 2 + 1): | ||
dp[i][j] = dp[i - 1][0] % MOD + dp[i - 1][3 - j] % MOD | ||
dp[i][j] %= MOD | ||
|
||
print(sum(dp[N]) % MOD) | ||
|
||
``` | ||
|
||
처음에 MOD로 나눠주는 것을 까먹어서, 메모리 초과를 판정 받았습니다. | ||
![](https://res.cloudinary.com/gyunseo-blog/image/upload/f_auto/v1720254285/image_cjndxv.png) | ||
그제서야 바로 MOD로 나눠주는 게 기억이 나서 나눠주고 AC를 받았습니다. |