Algorithm 211

[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

비트마스크 (Bit Mask)

비트마스크란 ? 비트마스크(Bit Mask)는 이진수를 사용하는 컴퓨터의 연산 방식을 이용하여, 정수의 이진수 표현을 자료 구조로 쓰는 기법을 말한다. 이진수는 0 또는 1을 이용하므로 하나의 비트(bit)가 표현할 수 있는 경우는 두 가지이다. 보통 어떤 비트가 1이면 "켜져 있다" 라고 말하며, 0이면 "꺼져 있다" 라고 말한다. 비트마스크의 장점 수행 시간이 빠르다. 연산이기 때문에 O(1)에 구현되는 것이 많다. 따라서 다른 자료구조를 이용하는 것보다 훨씬 빠르게 동작하게 된다. 이는 연산 횟수가 늘어날수록 차이가 매우 커지게 된다. 코드가 짧다. 메모리 사용량이 더 적다 ★ 예를 들면, bit가 10개인 경우에는 각 bit당 두 가지 경우를 가지기 때문에 2¹⁰ 가지 경우를 10bit 이진수 하..

Algorithm/개념 2021.12.30

[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

[Python] 2805. 나무 자르기

n, m = map(int, input().split()) # 나무의 수 n, 나무의 길이 m tree_h = list(map(int, input().split()) # 나무의 높이 s, e = 1, max(tree_h) # 시작 높이, 끝 높이 while s = mid: # mid보다 큰 나무라면 자르기 temp += tree - mid # temp == m: break 하면 안됨. 절단기의 높이를 더 높일 수 있기 때문 if temp >= m: # 목표 나무 길이보다 크다면 절단기 높이기 s = mid + 1 else: # 목표 나무 길이보다 작다면 절단기 낮추기 e = mid - 1 print(e)

Algorithm/Baekjoon 2021.12.16

[Python] 9251. LCS

seq1 = input() # 문자열 1 seq2 = input() # 문자열 2 seq_l1 = len(seq1) + 1 # 1번 문자열의 길이 seq_l2 = len(seq2) + 1 # 2번 문자열의 길이 dp = [[0 for _ in range(seq_l2)] for _ in range(seq_l1)] for i in range(1, seq_l1): # dp 배열 행열에 맞춰서(seq1-행, seq2-열) for문 선언 for j in range(1, seq_l2): if seq1[i-1] == seq2[j-1]: # 가장 최근에 추가된 글자가 같다면 dp[i][j] = dp[i-1][j-1] + 1 # 글자가 추가되기 전, 최대 길이 + 1 else: # 다르다면 dp[i][j] = max(d..

Algorithm/Baekjoon 2021.12.16

[Python] 12865. 평범한 배낭

n, k = map(int, input().split()) # 물품의 수 n, 버틸 수 있는 무게 k arr = [[0, 0]] + [list(map(int, input().split())) for _ in range(n)] # [물건의 무게, 물건의 가치] dp = [[0 for _ in range(k+1)] for _ in range(n+1)] for i in range(1, n+1): w = arr[i][0] # 현재 물건의 무게 v = arr[i][1] # 현재 물건의 가치 for j in range(1, k+1): if j < w: # 무게 j보다 현재 물건의 무게가 더 무겁다면 dp[i][j] = dp[i-1][j] # 바로 이전 물건, 같은 무게로 채우기 else: # 무게 j보다 현재 물건..

Algorithm/Baekjoon 2021.12.16