본문 바로가기

DP

(21)
[프로그래머스] 정수 삼각형 - 파이썬 정수 삼각형 문제 설명 위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 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 풀이...
프로그래머스 2 X n 타일링 - 파이썬 문제 설명 가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다. 타일을 가로로 배치 하는 경우 타일을 세로로 배치 하는 경우 예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다. 직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요. 제한사항 가로의 길이 n은 60,000이하의 자연수 입니다. 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요. 입출력 예 nresult 4 5 입..
백준 1949 우수마을 - 파이썬 문제. 풀이. dp[i]0는 i를 포함한 집합 가중치의 최댓값, dp[i][1]을 i를 포함하지 않은 부분 집합 가중치의 최댓값으로 지정하고 dfs를 이용하여 최댓값을 찾아주면 된다. 소스코드.
백준 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[..