BOJ 52

[Python] 14719. 빗물

h, w = map(int, input().split()) # 세로 길이 h, 가로 길이 w blocks_h = list(map(int, input().split())) # 블록의 높이들 l = 0 # 왼쪽 포인터 r = w-1 # 오른쪽 포인터 max_l = max_r = 0 # 왼쪽, 오른쪽의 각 블록의 최대 높이를 저장할 변수 rainwater = 0 # 고이는 빗물의 총량 while l < r: # 각 블록의 최대 높이 갱신 max_l = max(max_l, blocks_h[l]) max_r = max(max_r, blocks_h[r]) if max_l < max_r: # 오른쪽 블럭이 더 큰 경우 rainwater += max_l - blocks_h[l] # 왼쪽 블럭을 기준으로 빗물 계산 l ..

Algorithm/Baekjoon 2022.01.01

[Python] 2346. 풍선 터뜨리기

n = int(input()) # 풍선의 개수 papers = list(enumerate(map(int, input().split()))) # 풍선 안의 종이에 적혀 있는 수 p = 1 # 터트릴 지점을 가르키는 포인터 move = 0 # while n: p += move # 포인터 움직이기 # 포인터 인덱스에 맞추기 if move < 0: # 음수일때 p %= n else: # 양수일때 p = (p - 1) % n # 터진 풍선 고려해서 -1 해주기 idx, move = papers.pop(p) # 풍선 터뜨리기 (풍선 위치, 터진 풍선에 들어있는 종이) n -= 1 # 풍선개수 -1 print(idx + 1, end=' ') # 터진 풍선 위치 출력 포인터를 움직이는 방식으로 문제를 해결했다 ! * ..

Algorithm/Baekjoon 2022.01.01

[Python] 9252. LCS2

seq1 = input() # 문자열 1 seq2 = input() # 문자열 2 seq1_l = len(seq1) + 1 # 각 문자열의 길이 seq2_l = len(seq2) + 1 dp = [["" for _ in range(seq2_l)] for _ in range(seq1_l)] # LCS를 저장할 DP for i in range(1, seq1_l): for j in range(1, seq2_l): if seq1[i-1] == seq2[j-1]: # 방금 막 추가한 문자가 같다면 dp[i][j] = dp[i-1][j-1] + seq1[i-1] # 기존 문자열 + 방금 문자 else: # 같지 않다면 if len(dp[i-1][j]) < len(dp[i][j-1]): # 현재 dp의 좌측과 위의 ..

Algorithm/Baekjoon 2022.01.01

[Python] 1238. 파티

import heapq def dijkstra(s, e): dist = [float('inf') for _ in range(n+1)] # 경로 시간 초기화 queue = [] heapq.heappush(queue, [0, s]) # 시작 지점 넣어주기 dist[s] = 0 # 시작지점의 길이 0으로 설정 (시작 -> 시작 의 시간은 0) while queue: d, now = heapq.heappop(queue) # 현재까지의 시간과 현재 마을 꺼내기 if now == e: # 도착지점이면 시작 -> 현재 마을까지 최단 거리 return return d # 학생 마을 -> x 로 갈때만 해당 if dist[now] < d: # 현재 마을까지 걸리는 저장된 시간보다 꺼낸 시간이 더 크다면 pass cont..

Algorithm/Baekjoon 2022.01.01

[Python] 1504. 특정한 최단 경로

import heapq def dijkstra(s, e): dist = [float('inf') for _ in range(n + 1)] # 초기화 queue = [] heapq.heappush(queue, [0, s]) # 시작 지점 넣기 dist[s] = 0 while queue: d, now = heapq.heappop(queue) # 거리, 현재 정점 if now == e: # 도착 정점이면 중단 break if dist[now] < d: # 가지치기 continue for next in visited[now]: # 현재 정점에서 갈 수 있는 정점 탐방 nd = next[1] + d # 거리 더해주기 if nd < dist[next[0]]: # 출발 정점 ~ 다음 정점까지의 거리보다 작다면 dis..

Algorithm/Baekjoon 2021.12.16