본문 바로가기

알고리즘/Baekjoon

(196)
DP/최단거리 역추적. [13913] [3. 코드]
DP/최단거리 역추적. [9252] [1. 문제 설명] 두개의 문자열이 주어졌을 때, 두 문자열에서 공통되는 가장 긴 문자열을 출력한다. [2. 풀이 접근] LCS 의 길이를 찾는 방법은 아래를 참조한다. => 링크 LCS 길이를 찾고 난 다음 cache table 은 아래와 같은 초기화 되어있다. C A P C A K A 4 4 -1 -1 -1 -1 C 3 -1 3 3 -1 -1 A -1 2 2 2 2 -1 Y -1 -1 1 1 1 1 K -1 -1 1 1 1 1 P -1 -1 1 0 0 0 최초 cache[0][0] 이 어떻게 초기화 되었는지 추적해보면 str1[0] != str2[0] 이므로, LCS(1, 0) 과 LCS(0, 1) 중 최대 값에 의해 초기화 되어있음을 알 수 있다. 그래서 cache[0][1] 로 이동해야 한다. 여..
DP/최단거리 역추적. [14003] [1. 문제 설명] 수열의 길이가 최대 1백만이 주어 질 때, 이 수열의 최장 부분 수열의 길이와 최장 부분 수열을 출력한다. 수열의 각 원소는 x 는 아래와 같은 범위를 갖는다. [-10억, 10억] [2. 풀이 접근] 수열의 길이가 최대 1백만 이므로, N2 알고리즘으로는 LIS 의 길이조차 찾을 수 없다. LIS 의 길이는 nlogn 으로 찾을 수 있다. => 다음 풀이를 참조... 문제는 LIS 를 출력하는 것이다. LIS 의 길이를 찾기 위해 사용 한 배열이 항상 LIS 가 됨을 보장하지 않는다. 아래와 같은 입력을 생각하면, A = {1, 10, 100, 9} LIS 는 {1, 10, 100} 인데, 길이를 찾기 위해 사용 한 배열을 그대로 출력하면 {1, 9, 100} 이 출력된다. 정확한 ..
DP/최단거리 역추적. [12852] [3. 코드]
DP/최단거리 역추적. [14002] [3. 코드]
스위핑/구간트리. [3392] [1. 문제 설명] [2. 풀이 접근] [3. 코드]
스위핑/구간트리. [17131] [1. 문제 설명] [2. 풀이 접근] [3. 코드]
스위핑/구간 트리. [5419] [1. 문제 설명] 북서풍으로 인해 현재 위치에서 동쪽과 남쪽 사이의 위치로만 이동 할 수 있을 때 북서풍을 타고 항해 할 수 있는 섬의 쌍의 수를 구하도록 한다. [2. 풀이 접근] 먼저 전체 좌표를 y 의 내림차순으로 정렬한다. 그러면 이전 좌표는 신경쓰지 않아도 된다. 현재 위치에서 남쪽으로만 갈 수 있지, 북쪽으로는 갈 수 없기 때문이다. 이 상태에서 x 를 처리하도록 한다. 기본적인 생각은 x 의 발생 빈도를 구간 트리로 처리하는 것이다. 아래 그림에서 2번 좌표는 최소 31 번까지의 좌표로 이동 할 수 없다. 남쪽으로는 갈 수 있지만, 서쪽으로 이동 하기 때문이다. 즉, 남은 구간에서 현재 x 보다 큰 것의 개수만 구할 수 있다면, 현재 섬에서 동남쪽으로 이동 할 수 있는 점의 개수를 찾을 수..
스위핑. [2836] [1. 문제 설명] 0번 위치에서 M번 위치까지 가려고 하는데, 이 사이에 A 위치에서 B 위치로 이동하려는 사람들을 운송해야 할 때, 이동해야 하는 최소거리를 구한다. [2. 풀이 접근] A B 인 경우로 운송자가 가려는 방향과 반대되는 경우이다. 검정색 화살표는 운송자가 이동하는 방향이고 빨간색 화살표는 승객이 이동하려는 방향이다. 이 빨간색 화살표들을 최소 거리로 이동하면 된다. 2번 승객을 처리하고, 3번 승객을 처리하고, 마지막으로 1번 승객을 처리하는 것이 아니라 1번 승객을 먼저 처리하고, 2번 승객을 태우고, 3번 승객을 태운 다음 3번 승객을 먼저 내리고 2번 승객을 먼저 내리게 하면 된..
스위핑. [2170] [1. 문제 설명] 선을 여러번 그었을 때, 그어진 선의 총길이를 구한다. 중복되어 그어진 구간은 한번만 계산해야 한다. [2. 풀이 접근] 단순한 풀이로는 절대 시간내 해결 할 수 없다. 겹치는 구간등을 확인해야 할 때, 그 범위가 너무 넓기 때문이다. (문제 입력 상 구간의 최대 길이는 20억) 그림을 좀 그리다보면 풀이에 대한 실마리가 조금 잡힌다. // 여기에 그림이 필요.. 즉, 모든 구간을 X 를 기준으로 정렬 하면, 순차적으로 탐색하다보면 X 를 시작으로 하여 선을 그었을 때 겹쳐지는 최대 구간을 알 수 있다. => 자신보다 뒤에오는 구간의 시작 점은 자신보다 앞에 위치 할 수 없다. => 지금까지 업데이트 한 구간 내에 있거나, 그 구간을 좀 더 확장시키거나, ... 여기서 중요한 점은 새..