본문 바로가기
반응형

프로그래밍/알고리즘 문제39

[분할정복] LeetCode 14 - Longest Common Prefix class Solution: def merge(self, left, right): result = "" min_len = min(len(left), len(right)) for i in range(min_len): if left[i] == right[i]: result += left[i] else: return result return result def divideConquer(self, arr, low, high): if low >= high: return arr[low] m = (low + high) // 2 leftStr = self.divideConquer(arr, low, m) rightStr = self.divideConquer(arr, m + 1, high) return self.merge.. 2021. 3. 16.
[DP] 백준 2011 암호코드 (python) DP 알고리즘에서 Top-Down 방식은 재귀호출을 사용한다고 한다. 큰 문제를 작은 문제로 나누어 푸는 방식. 그러나 python은 재귀가 오래 걸리고 메모리 초과가 날 수 있다. 그러니 python은 Bottom-Up 방식을 사용하자. 작은 문제부터 풀고 문제를 점점 크게 만들면서 푼다. a = list(map(int, list(input()))) l = len(a) # dp[i] : i번째 수 단계에서 암호 코드의 개수 dp = [0] * (l+1) if a[0] == 0: # 암호 만들 수 없는 경우 print(0) else : a = [0] + a # 인덱싱을 위해 추가한 0 dp[0] = 1 dp[1] = 1 # 첫번째 수로 이뤄진 암호코드는 1개이다. for i in range(2, l+1).. 2020. 3. 9.
17616 등수 찾기 (python) 2. 등수 찾기 (17616) - BFS 문제조건 학생 두 명의 점수비교만 주어진다. 동점자는 없다. 학생 x의 가장 높은 등수와 낮은 등수는 ? 아이디어 학생 x보다 큰놈 몇명, 작은놈 몇명만 알면 된다. 누가 더 크고 작냐는 중요하지 않다. 가장 높은 등수 : 가장왼쪽에 있음 (작은놈), 가장 낮은 등수 : 가장 오른쪽에 있음 (큰놈) 으로 생각하자. 헷갈려 가장 높은 등수 : 1 + 학생x보다 작은 학생수 가장 낮은 등수 : 전체학생수 - 학생x보다 높은 학생수 Bfs 로 풀 수 있단다. wow 코드 from collections import deque def bfs(x, adj): rtn = 0 q = deque() q.append(x) visited[x] = True # 방문한 횟수가 학생 x보.. 2019. 12. 14.
17615 볼 모으기 (python) 1. 볼 모으기 (17615) 문제조건 빨간색 혹은 파란색 공 한 개만 움직일 수 있다. 뭉터기를 한 번에 건너뛰어 이동시킬 수 있다. 같은 색끼리 모으되 최소 이동횟수를 찾아라. 아이디어 총 4가지 경우가 있다. R을 옮기는데, R을 오른쪽으로 모으는 경우 R을 옮기는데, R을 왼쪽으로 모으는 경우 B를 옮기는데, B를 오른쪽으로 모으는 경우 B를 옮기는데, B를 왼쪽으로 모으는 경우 R을 움직일건데, R뭉터기가 있으면 고려할 필요가 없다. 뭉터기를 제외한 나머지 ball에서 쇼부를 치면 된다. 왼쪽으로 모으는 경우도 오른쪽으로 모으는 경우와 동일한 컨셉으로 이동하면 된다. ball 리스트를 역순으로 만들어 진행하면 된다. 코드 # 움직이려는 색깔 공이 뭉터기 되어 있는 부분은 고려할 필요가 없으니 p.. 2019. 12. 14.
[BOJ 1012 유기농배추] BFS와 DFS로 풀기 (python) 문제조건 연결요소(덩어리)의 개수를 찾는다. 가로, 세로와 행열 인덱스 주의하자. 핵심개념 pypy는 최대 재귀깊이가 10만으로 설정되어 있다. 이걸 넘으면 런타임에러가 발생한다. sys.setrecursionlimit(10**6) 100만으로 늘려준다. (참ㅋㅋㅋㅋㅋ) DFS가 BFS보다 메모리를 적게 쓰긴 하는구나. 코드 DFS (메모리 30276 KB) dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1] import sys sys.setrecursionlimit(10**6) #재귀 깊이 설정 (10만 -> 100만) def dfs(x, y, _cnt): dist[x][y] = _cnt for k in range(4): nx, ny = x+dx[k], y+dy[k] if 0 2019. 10. 14.
[SWEA] 구슬탈출 2 문제조건 빨간구슬, 파란구슬 두 개가 동시에 위치 이동을 한다. (정점의 위치가 변한다!) 빨간구슬, 파란구슬은 같은 위치에 있을 수 없다. (장애물정점의 위치도 변한다!) 한 번 이동 시, 갈 수 있을 때까지 쭈욱 간다. 핵심개념 BFS에서 queue에는 x,y 좌표 한 개만 담으라는 법은 없다. 빨간구슬의 (x,y), 파란구슬의 (x,y)를 같이 담는다. 종료조건을 먼저 생각하자. 1) 움직인 횟수 10번 넘었거나 (실패) 2) 10번 안 넘었지만 탈출할 수 없거나 (실패) 3) 빨간구슬이 탈출에 성공했거나 코드 from collections import deque n, m = map(int, input().split()) a = [list(map(str, input())) for _ in range.. 2019. 10. 9.
반응형