diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 62b3011ee..9eadb44e1 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -22,16 +22,16 @@ ] }, { - "id": "44994a6aa79bf7e6", + "id": "932958f597546de7", "type": "tabs", "children": [ { - "id": "e497ed46ee466b84", + "id": "a847079fc4a2b861", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "src/content/blog/leet-code-438-find-all-anagrams-in-a-string.md", + "file": "src/content/blog/boj-1309-동물원.md", "mode": "source", "source": false } @@ -103,7 +103,7 @@ "state": { "type": "backlink", "state": { - "file": "src/content/blog/leet-code-438-find-all-anagrams-in-a-string.md", + "file": "src/content/blog/boj-1309-동물원.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -120,7 +120,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "src/content/blog/leet-code-438-find-all-anagrams-in-a-string.md", + "file": "src/content/blog/boj-1309-동물원.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -143,7 +143,7 @@ "state": { "type": "outline", "state": { - "file": "src/content/blog/leet-code-438-find-all-anagrams-in-a-string.md" + "file": "src/content/blog/boj-1309-동물원.md" } } } @@ -166,9 +166,10 @@ "table-editor-obsidian:Advanced Tables Toolbar": false } }, - "active": "e497ed46ee466b84", + "active": "a847079fc4a2b861", "lastOpenFiles": [ "src/content/blog/leet-code-1438-longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit.md", + "src/content/blog/boj-1309-동물원.md", "src/content/blog/leet-code-438-find-all-anagrams-in-a-string.md", "src/content/blog/boj-10159-저울.md", "src/content/blog/leet-code-64-minimum-path-sum.md", @@ -212,7 +213,6 @@ "src/content/blog/boj-15664-N과-M-(10).md", "src/content/blog/boj-15663-N과-M-(9).md", "src/content/blog/boj-11728-배열-합치기.md", - "src/content/blog/boj-10819-차이를-최대로.md", - "src/content/blog/boj-2230-수-고르기.md" + "src/content/blog/boj-10819-차이를-최대로.md" ] } \ No newline at end of file diff --git "a/src/content/blog/boj-1309-\353\217\231\353\254\274\354\233\220.md" "b/src/content/blog/boj-1309-\353\217\231\353\254\274\354\233\220.md" new file mode 100644 index 000000000..799bfbdde --- /dev/null +++ "b/src/content/blog/boj-1309-\353\217\231\353\254\274\354\233\220.md" @@ -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를 받았습니다.