[백준] 12670 The Year of Code Jam (Large) Python 3
·
코딩/백준-알고리즘
import sysfrom collections import dequeclass Dinic: def __init__(self, n): """ n: 전체 노드 수 인접 리스트 구조: adj[u] = [(v, capacity, rev), ...] - v: 다음 노드 - capacity: 잔여 용량 - rev: v의 인접 리스트에서 역방향 간선의 index """ self.n = n self.adj = [[] for _ in range(n)] def add_edge(self, u, v, cap, is_directed=True): """ ..
[백준] 11682 Landscaping Python 3
·
코딩/백준-알고리즘
import sysfrom collections import dequeclass MaxFlow: def __init__(self, n): self.n = n # adj[u] = [ [v, rev_idx, capacity], ... ] # - v: 다음 노드 # - rev_idx: v의 인접 리스트에서 이 간선의 역방향 간선 인덱스 # - capacity: 이 간선이 현재 흘려보낼 수 있는 잔여 용량 self.adj = [[] for _ in range(n)] # 경로 복원을 위한 배열(역방향 간선의 인덱스를 저장) self.par = [-1] * n def add_edge(self, ..
[백준] 18438 LCS 5 C++
·
코딩/백준-알고리즘
분할 정복을 활용한 LCS 복원 알고리즘두 문자열 사이의 최장 공통 부분 수열(Longest Common Subsequence, LCS)을 구하는 문제는 전산학에서 매우 중요한 문제 중 하나입니다. 이 글에서는 분할 정복 기법을 활용하여 LCS를 복원하는 효율적인 알고리즘을 소개합니다. 이를 구현한 C++ 코드를 분석하고, 어떻게 동작하는지 하나씩 살펴보겠습니다. 1. 문제 정의주어진 두 문자열 a와 b에 대해:공통으로 존재하는 문자의 순서를 유지하는 가장 긴 부분 수열을 찾아야 합니다.예를 들어, 문자열 a = "ACDBE"와 b = "ABCDE"가 주어지면, 두 문자열의 LCS는 "ACDE"가 됩니다. 2. 코드의 주요 흐름이 코드는 분할 정복을 사용하여 LCS를 효율적으로 복원합니다. 기존의 동적 ..
[백준] 25954 LCS 9 C++,번외 PyPy3
·
코딩/백준-알고리즘
최적화와 포인터 활용을 통한 효율적인 DP 알고리즘 구현C++의 강력한 최적화 기능과 효율적인 메모리 관리 기법을 활용한 DP 알고리즘을 소개합니다.이 코드는 두 문자열을 입력받아 특정 계산을 수행하며, #pragma GCC optimize와 같은 최적화 기법과 포인터를 활용해 성능을 극대화한 예시입니다. 코드의 주요 특징GCC 최적화 옵션:코드 상단에 #pragma GCC optimize("O3,unroll-loops")를 추가하여 컴파일러가 가능한 한 성능을 극대화하도록 설정합니다. unroll-loops는 반복문 언롤링을 통해 실행 속도를 높입니다.메모리 사용 최적화:short 타입을 사용하여 메모리를 절약합니다. 배열 크기는 최대 7000 x 7000이므로, int 대신 short(2바이트)를 선..
[백준] Round words Python 3
·
코딩/백준-알고리즘
문자열 LCS 문제를 비트마스크로 풀어보기LCS(Longest Common Subsequence, 최장 공통 부분 수열)는 문자열 문제에서 자주 등장하는 주제입니다. 두 문자열 간에 공통된 부분 수열 중 가장 긴 길이를 구하는 이 문제는 전통적으로 DP(Dynamic Programming)를 사용해 해결합니다. 그러나 오늘은 비트마스크를 활용하여 LCS 문제를 빠르고 효율적으로 푸는 방법과 이를 응용한 문제를 알아보겠습니다.비트마스크를 이용한 LCS 계산주어진 코드는 문자열 a와 b의 LCS 길이를 비트마스크로 계산하는 방식입니다. 비트마스크는 메모리를 효율적으로 사용하면서 대규모 연산을 빠르게 처리할 수 있는 강력한 도구입니다.핵심 로직b 문자열의 비트마스크 준비b에서 각 알파벳의 등장 위치를 기록합니..
[백준] 18439 LCS 6 C++
·
코딩/백준-알고리즘
효율적인 비트셋 기반 LCS(Largest Common Subsequence) 구현두 문자열 사이의 최장 공통 부분 수열(Longest Common Subsequence, LCS)은 컴퓨터 과학에서 자주 등장하는 문제입니다. 일반적인 동적 계획법(DP)을 활용한 방식은 O(n*m)의 시간 복잡도를 가지며, 두 문자열의 길이가 클수록 메모리 사용량과 실행 시간이 증가합니다. 1. 문제 정의주어진 두 문자열 a와 b에 대해:공통으로 존재하는 문자의 순서를 유지하는 가장 긴 부분 수열의 길이를 계산해야 합니다.예를 들어:a = "ACDBE", b = "ABCDE"가 주어졌을 때, 두 문자열의 LCS는 "ACDE"이며 길이는 4입니다.2. 알고리즘의 핵심 아이디어비트셋 기반 LCS 알고리즘은 아래의 원리로 작동..
[백준] 1046 그림자 Python 3
·
코딩/백준-알고리즘
문제 접근 방식방의 구조를 입력받고, 광원의 위치와 벽의 개수를 파악합니다.광원으로부터 빛이 퍼지는 영역을 계산합니다. 이때 빛이 벽에 의해 차단되는 경우를 고려합니다.각 방향(상하좌우)으로 빛이 퍼져나가며, 빛이 닿는 영역을 계산합니다.최종적으로 빛이 닿는 영역의 총 면적을 계산하여 빈 공간에 대한 비율을 출력합니다.각 함수의 역할 및 설명1. get_triangle_area 함수이 함수는 주어진 삼각형의 면적을 계산합니다. 삼각형의 세 점 중 두 점이 x축 위에 있을 때, 삼각형의 밑변과 높이를 이용해 면적을 계산합니다. 이 함수는 빛이 벽에 의해 차단되는 경우 삼각형 면적을 빼기 위해 사용됩니다.2. get_light_area_and_next 함수이 함수는 현재 y 좌표에서 빛이 비추는 영역과 다음..
[백준] 2586 소방차 Python 3
·
코딩/백준-알고리즘
문제 설명 이 문제는 여러 대의 소방차가 펌프에서 물을 채우기 위해 호스를 연결할 때, 호스의 총 길이를 최소화하는 문제입니다. 이 문제를 해결하기 위해 펌프와 소방차의 위치를 고려하여 가장 가까운 펌프와 소방차를 연결하는 방법을 구현했습니다. 이 코드는 bisect 모듈을 사용하여 이진 탐색을 통해 가장 가까운 펌프를 찾고, 동적 계획법을 사용하여 이미 사용된 펌프를 피하는 로직을 포함하고 있습니다. upper_bound 함수 upper_bound 함수는 주어진 배열에서 값이 들어갈 위치를 찾는 함수입니다. 이 함수는 bisect 모듈의 bisect_right 함수를 사용하여 배열에서 value보다 큰 값이 처음 나타나는 위치를 반환합니다. 이 함수는 소방차의 위치에 가장 가까운 펌프를 찾는 데 사용됩..
[백준] 수열과 퀴리 13 Python 3 (Feat 비효율)
·
코딩/백준-알고리즘
세그먼트 트리와 지연 전파를 활용한 효율적인 구간 연산 처리세그먼트 트리(Segment Tree)와 지연 전파(Lazy Propagation)를 활용하여 구간 연산을 효율적으로 처리하는 파이썬 코드를 작성해 보겠습니다. 세그먼트 트리는 구간 합, 구간 최솟값, 구간 최댓값 등 다양한 구간 연산을 빠르게 처리할 수 있는 자료구조입니다. 여기에 지연 전파 기법을 추가하여 업데이트 연산을 최적화할 수 있습니다.문제 설명주어진 배열에 대해 다음과 같은 연산을 효율적으로 수행하는 프로그램을 작성합니다:특정 구간의 모든 원소에 값을 더하는 연산특정 구간의 모든 원소에 값을 곱하는 연산특정 구간의 모든 원소를 특정 값으로 바꾸는 연산특정 구간의 합을 구하는 연산이 문제는 세그먼트 트리와 지연 전파를 사용하여 해결할 ..