본문 바로가기
728x90

알고리즘322

[python] 백준 16565 N 포커 https://www.acmicpc.net/problem/16565  문제 해결DP를 이용해 n개중 m개를 뽑았는데 그중 k개 종류가 나올 경우의 수를 dp[m][k]라고 정의한다.dp[0][0]은 1로 정의그러면 $ dp[i][j] = \sum_{k=0}^{3}  \binom{4}{k}  \times dp[i-k][j-1]$ 이후 포카드가 나올 수 있는 경우의 수를 계산하기 위해idx (포카드 나오는 개수)$ ans += \binom{13}{idx} * dp[n-4*idx][13-idx]$ CODEimport sysinput = sys.stdin.readlineimport mathmod = 10007def combination(n, r): return math.factorial(n)//(math... 2024. 5. 23.
[python] 20188 등산 마니아 https://www.acmicpc.net/problem/20188     문제 해결트리와 DFS를 사용해야한다는 것은 쉽게 알 수 있지만 어떻게 활용할지 매우 어려운 문제https://youtu.be/AQzKDzQqIRE다음 동영상을 봐도 어렵다...  CODEimport sysinput = sys.stdin.readlinefrom collections import deque, defaultdictsys.setrecursionlimit(10**8)def dfs(cur, parent): global ans for child in graph[cur]: if child != parent: dfs(child, cur) dp[cur] += dp[ch.. 2024. 5. 22.
[python] 백준 2150 Strongly Connected Component https://www.acmicpc.net/problem/2150 문제 해결Kosaraju 알고리즘과 Tarjan 알고리즘 두가지 방법이 있다고 한다.하지만 하나 공부하기도 힘드므로 Kosaraju알고리즘을 공부하고 코드를 작성한다....Stack으로 DFS탐색을 하며 종료되는 노드를 append한 후 역방향 DFS를 통해 한번에 탐색되는 여러 정점을 SCC로 묶는 방법이 Kosaraju 알고리즘 방법이다. CODE import sysinput = sys.stdin.readlinesys.setrecursionlimit(10**6)def dfs(node, visited, stack): visited[node] = 1 for ne in graph[node]: if not visited.. 2024. 5. 9.
[python] 백준 2635 수 이어가기 https://www.acmicpc.net/problem/2635 2635번: 수 이어가기 첫 번째 수가 주어진다. 이 수는 30,000 보다 같거나 작은 양의 정수이다. www.acmicpc.net 문제 해결 첫 번째 수가 주어지고 두 번째수는 첫번째 수 이하인 부분들을 반복해나가면서 최적의 수를 찾아야한다. 사실 재귀를 사용해서 최대 길이를 찾는 것은 어렵지 않다. 하지만 문제를 잘 읽어야하는게 이후 나오는 수들은 0이여도 상관이 없다는 것이다.(음이 아닌 수이기 때문) 문제 난이도는 쉬운 편 CODE import sys input = sys.stdin.readline def dfs(A:list): global target, ans if A[-2] - A[-1] >= 0: A.append(A[-2] .. 2024. 4. 18.
728x90