본문 바로가기

Python265

[백준 1520번] 내리막 길 import sys sys.setrecursionlimit(50000000); m, n = map(int,input().split()) area = [list(map(int,input().split())) for _ in range(m)] dp = [[-1]*n for _ in range(m)] nx, ny = [-1,1,0,0], [0,0,-1,1] def dfs(x,y): # 도착 지점에 도달하면 1 리턴 if x == (m-1) and y == (n-1): return 1 # 이미 방문한 길이라면 경우의 수를 구하지 않고 해당 위치에서 출발하는 경우의 수 리턴 if dp[x][y] != -1: return dp[x][y] way_count = 0 for i in range(4): temp_x = x.. 2023. 4. 10.
[백준 2583번] 영역 구하기 from collections import deque m,n,k = map(int,input().split()) area = [[0]*n for _ in range(m)] visited = [[False]*n for _ in range(m)] count_list = [] for i in range(k): x1, y1, x2, y2 = map(int,input().split()) for j in range(y1,y2): for k in range(x1,x2): area[j][k] = 1 def bfs(x,y): if visited[x][y] or area[x][y] == 1: return False count = 1 queue = deque([(x,y)]) visited[x][y] = True while .. 2023. 4. 6.
[백준 11725번] 트리의 부모 찾기 import sys sys.setrecursionlimit(50000000); n = int(input()) graph = [[] for _ in range(n+1)] result = [0]*(n+1) visited = [False]*(n+1) for _ in range(n-1): a, b = map(int,input().split()) graph[a].append(b) graph[b].append(a) def dfs(graph,v,visited): visited[v] = True for i in graph[v]: if not visited[i]: result[i] = v dfs(graph,i,visited) dfs(graph,1,visited) for i in range(2,n+1): print(res.. 2023. 4. 6.
[백준 2565번] 전깃줄 n = int(input()) data = [] dp = [1]*n for _ in range(n): data.append(list(map(int,input().split()))) data.sort(key=lambda x:x[0]) for i in range(1,n): for j in range(i): if data[i][1] > data[j][1]: dp[i] = max(dp[i], dp[j]+1) print(n-max(dp)) 이번 문제는 A와 B 전봇대 사이에 연결된 전깃줄의 정보와 전깃줄의 개수가 주어졌을 때, 모든 전깃줄이 서로 교차하지 않도록 하기 위해 제거해야 하는 전깃줄의 최소 개수를 구하는 문제이다. 처음에 이 문제를 접했을 때 이전에 풀던 DP 방식(n=1 부터 구하면서 점화식을 찾는 .. 2023. 3. 25.
[백준 14501번] 퇴사 n = int(input()) data = [] for i in range(n): data.append(tuple(map(int,input().split()))) dp = [0] * 1006 for i in range(n-1,-1,-1): time = data[i][0] value = data[i][1] if (i+time) 2023. 3. 22.
[백준 2193번] 이친수 이번 문제는 이전에 풀었던 01타일 문제와 매우 유사한 문제로, 다음과 같은 조건을 만족하는 이친수의 개수를 구하는 문제이다. 이친수는 0으로 시작하지 않는다. 이친수에서는 1이 두 번 연속으로 나타나지 않는다. 즉, 11을 부분 문자열로 갖지 않는다. 이러한 패턴의 문제는 n=1 부터 차근차근 구하면서 점화식을 찾아내는 것이 핵심인데, n=1부터 차례대로 값을 구해본 결과 다음과 같은 점화식을 얻을 수 있었다. dp[1] = 1, d[2] = 1 dp[n] = dp[n-1] + dp[n-2] (n>=3) 이러한 점화식을 도출한 후, DP 테이블에 저장하여 쉽게 풀 수 있었던 DP 문제였다 :) 2023. 3. 22.