본문 바로가기

다이나믹 프로그래밍

(17)
[프로그래머스] 정수 삼각형 - 파이썬 정수 삼각형 문제 설명 위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다. 삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요. 제한사항 삼각형의 높이는 1 이상 500 이하입니다. 삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다. 입출력 예 triangleresult [[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30 풀이...
백준 15681 트리와 쿼리 - 파이썬 문제. 풀이. dfs를 루트노드부터 시작해서 각각의 서브트리의 갯수를 계산하면된다. 소스코드.
백준 11780 플로이드 2 - 파이썬 문제. 풀이. 플로이드 와샬 알고리즘을 사용하되, 이동 경로도 기록해서 출력해야한다. 입력받을 때 이동경로도 그래프에 기록을 한다. 그리고 플로이드 와샬 알고리즘을 실행하면서 더 짧은 경로가 있을때, 최솟값과 경로도 업데이트 하여 저장을 하면된다. 소스코드. import sys def floyd_warshall(): # 경유지 for k in range(n+1): # 출발지 for i in range(n+1): # 도착지 for j in range(n+1): if graph[i][j][0] > graph[i][k][0] + graph[k][j][0]: graph[i][j][0] = graph[i][k][0] + graph[k][j][0] graph[i][j][1] = graph[i][k][1] + gra..
백준 11779 최소비용 구하기 2 - 파이썬 문제. 풀이. 다익스트라를 이용해서 풀면된다. 다익스트라로 최소거리를 구하면서 이동경로를 기록해주고 최소거리와 이동경로를 출력해주면 된다. 소스코드. import sys import heapq def dijkstra(start): dp[start][0] = 0 dp[start][1] = [start] heap = [] heapq.heappush(heap, [0, start]) while heap: now_weigth, now = heapq.heappop(heap) if dp[now][0] < now_weigth: continue for next, weight in graph[now]: next_weight = weight + now_weigth if next_weight < dp[next][0]: dp[..
백준 13913 숨바꼭질 4 - 파이썬 문제. 풀이. 이 문제도 경로를 저장하는 배열을 저장해서 연산마다 경로를 추가했는데 이 방법으로하면 메모리가 초과된다. 이 방법은 이동한 경로를 나타내는 배열을 하나 선언한뒤 어디로 이동했는지 표시하고 목표지에 도착했을때, 해당 위치에서부터 어떻게 이동했는지를 체크하면된다. 소스코드. import sys from collections import deque def path(x): arr = [] temp = x for i in range(matrix[x] + 1): arr.append(temp) temp = move[temp] arr.reverse() print(*arr) def BFS(n): queue = deque() queue.append(n) while queue: x = queue.popleft..
백준 9252 LCS 2 - 파이썬 문제. 풀이. 공통의 부분 수열을 찾고 LCS를 출력하는 문제이다. DP 배열을 선언해서 각 위치마다 최대 몇개의 공통이 되는지 체크를 하고 경로들을 저장해서 출력한다. 소스코드. import sys input = sys.stdin.readline a = input().strip() b = input().strip() dp = [[[0, []] for i in range(len(a) + 1)] for j in range(len(b) + 1 )] for i in range(len(a)): for j in range(len(b)): if a[i] == b[j]: dp[j+1][i+1][0] = dp[j][i][0] + 1 dp[j+1][i+1][1] = dp[j][i][1] + [b[j]] else: dp[..
백준 14003 가장 긴 증가하는 부분 수열 5 - 파이썬 문제. 풀이. O(NlogN)로 문제를 풀어야한다. https://turret1234.tistory.com/151 백준 12015 가장 긴 증가하는 부분 수열2 - 파이썬 문제. 풀이. 이분 탐색을 이용하여 dp배열의 최댓값과 비교하여 큰 값이면 오른쪽에, 낮은 값이면 dp배열의 값에서 이분 탐색을 이용하여 해당 값이 들어갈 위치를 결정하여 dp 배열에 넣고 dp 배 turret1234.tistory.com 기본적인 풀이방법은 위 링크와 같다. 여기서 경로를 저장한 배열을 만들고 연산마다 경로를 추가하여주면된다. 소스코드. import sys from bisect import bisect_left input = sys.stdin.readline n = int(input()) numbers = [0] + ..
백준 14002 가장 긴 증가하는 부분 수열 4 - 파이썬 문제. 풀이. https://turret1234.tistory.com/138 백준 11053 - 가장 긴 증가하는 부분 수열 문제. 풀이. 첫번째 위치부터 수열의 길이의 최댓값을 저장하고 자기 자신보다 작은 숫자들 중 가장 큰 길이를 자기 위치에 넣고 +1을 하고 dp의 최댓값을 출력하면 된다. 소스코드. import sys A = int turret1234.tistory.com 기본적으로 가장 긴 증가하는 부분 수열의 길이를 구하는 방법은 위의 링크와 같다. 여기서 추가적으로 경로를 담아야하는데. 경로를 담는 dp배열을 추가하여 연산마다 경로를 담아준다. 소스코드. import sys input = sys.stdin.readline n = int(input()) numbers = list(map(int..