티스토리 뷰

ICPC/World Finals

ACM ICPC World Finals 2018

전명우 2018.05.08 18:07

문제 링크


B. Comma Sprinkler


길이가 최대 1,000,000인 문장들이 주어진다. 어떤 단어 앞에 콤마(,)가 오면 같은 단어 앞에 모두 콤마가 오도록 바꾸며, 어떤 단어 뒤에 콤마가 올 경우 같은 단어 뒤에 모두 콤마가 오도록 바꿔야한다. 단, 단어의 끝과 시작에서 부자연스럽게 콤마를 추가하진 않는다. 이 때, 최종 문장을 구하는 문제다.


같은 단어들을 묶어 정점으로 만든다. 그리고 정점을 단어 앞에 콤마가 오는 경우, 단어 뒤에 콤마가 오는 경우를 나타내는 두 정점으로 이원화한다. 단어 앞에 콤마가 오거나, 단어 뒤에 콤마가 오는 경우 해당하는 정점에 색칠은 한 뒤, 원래 문장에서 인접한 두 단어의 정점에는 방향성 간선을 만들어주어 Flood-Fill 한다. 그러면 시간복잡도 $O(V+E)$만에 문제에서 요구하는 조건을 만족시킬 수 있다. 단어를 정점으로 만들 때, set등을 쓰지 않고 trie를 사용하면 $O(N)$ 시간에 문제를 해결할 수 있다.


코드 보기


F. Go with the Flow


단어 $N$개가 주어진다. 각 단어의 최대 길이는 80이다. 종이의 폭을 적절히 정해 생기는 공백 강(세로로 늘어진 공백 행렬)의 길이를 최대화하는 문제다. 단, 줄의 오른쪽 끝에 자연스럽게 생기는 공백은 공백 강에 포함되지 않는다.


폭으로 가능한 길이의 종류 수는 약 $80N$이며, 폭에 따라 생기는 공백의 개수는 최대 $N$개다. 임의의 폭을 정했을 때, 공백 강의 최대 길이를 two-pointers algorithm과 DP를 통해 $O(N)$ 시간복잡도로 구할 수 있다. 따라서 이 문제를 $O(N^2)$에 해결할 수 있다.


코드 보기


K. Wireless is the New Fiber


$N$개의 정점과, $M$개의 간선으로 이루어진 연결그래프가 주어진다. $N$개의 정점으로 구성된 기존 그래프와 전혀 다른 트리를 새로 만드는데, 차수(degree)가 변한 정점의 수를 최소화하도록 만드는 문제다.


이 문제는 두 파트로 풀이가 나뉜다. 첫 번째 파트는 차수가 변환 정점 수를 최소화하면서 새로 만드는 트리의 각 정점 차수를 구하는 것이고, 두 번째 파트는 구한 각 정점의 차수를 기반으로 트리를 만들어서 출력하는 것이다.


우선, $N$개의 정점 차수 합이 $2 \times (N-1)$이면서 각 정점의 차수가 1이상 $N-1$이하라면, 해당 차수에 알맞은 트리를 항상 만들 수 있다. 이는 필요충분조건이다.

이를 이용하여, 첫 번째 파트를 해결한다. "차수가 변한 정점의 개수가 $x$개 이하면서 모든 정점의 차수를 1이상 N-1이하로 맞출 수 있느냐"라는 결정 문제를 생각해보자. 이는 greedy하게 해결이 가능한데, 차수가 제일 큰 상위 $x$개 정점의 차수를 변화시켜 가능한지 여부를 간단한 수학으로 계산하면 된다. Parametric search와 결정 문제 풀이를 이용해서 첫 번째 파트를 해결할 수 있다.


두 번째 파트는 풀이가 더 간단하다. 각 정점의 차수를 모두 알고 있는 상태에서 트리를 구현하는 문제를 해결하면 된다. 차수 크기의 역순으로 정점들을 정렬한 뒤에, 차수가 큰 정점들끼리 우선으로 간선을 만들어주면 결국 트리가 완성된다. 이와 관련된 증명은 "$k < N$일 때, 차수가 가장 큰 상위 $k$개 정점의 차수 합은 $2 \times (k-1)$을 넘는다."는 사실을 통해 할 수 있다.


코드 보기


A. Catch the Plane


$N$개의 버스정류장과 $M$개의 버스 운행 정보가 있다. 버스 운행 정보는 시작점과 도착점, 출발시각과 도착시각, 그리고 파업 확률이 주어진다. 한 순간에 한 정류장에서 여러 버스가 출발하면 그 중에 하나만 선택하여 "탑승 시도"를 할 수 있다. 이 때, 0번 정류장에서 시작하여 1번 정류장까지 이동할 때, 도착 확률이 최대가 되도록 전략을 짜는 문제다.


여기서 도착 시간제한 $K$가 입력으로 주어지지만, 모든 버스의 도착 시각이 $K$이내인 관계로 $K$ 값 자체와 시간제한 자체가 의미가 없다. 이 문제 풀이의 핵심 아이디어는 DP를 거꾸로 계산한다는 것이다.


다음과 같은 DP 테이블을 생각하자:

D[i][j] = j 시간에 i번 정류장에서 출발할 때, 도착 지점까지 가는 최고 확률

j 시간에 만약 k번 정류장으로 가는 버스가 있고 도착시각이 t이며 파업확률이 p라고 할 때, 이 버스 탑승을 시도할 경우 도착 확률은 D[k][t+1]*p + D[i][j+1]*(1-p)로 계산할 수 있다. 만약 탑승 시도를 하지 않고 시간을 보내는 경우 도착 확률은 D[i][j+1]이다. 이 중에 제일 높은 확률을 D[i][j]에 대입하는 것으로 점화식을 세울 수 있다.


문제는 시간 범위가 최대 1018으로 굉장히 크다는 것이다. 위에서 설명한 DP를 버스 도착시각 역순으로 계산해가면서 대기 힙과 큐를 이용하여 계산하면 2차원 테이블 없이 1차원 배열만으로 이 문제의 답을 구할 수 있다.


코드 보기


H. Single Cut of Failure


$W \times H$ 크기의 직사각형 안에 $N$개의 선분이 주어진다. 선분의 양 끝 점은 직사각형 변 위에 있으며, 꼭지점과 겹치지 않고 선분의 끝 점이 서로 겹치게 주어지지 않는다. 또한 선분이 직사각형 변에 포함되게 주어지지 않는다. 주어진 $N$개의 선분과 모두 교차하게 최소 개수의 선분을 그리는 문제다.


두 대각선을 X 모양으로 그리면 입력이 어떤 식으로 들어오든 상관 없이 모든 선분과 교차함을 알 수 있다. 따라서, 답은 1개 혹은 2개이며, 2개일 경우 출력 내용은 선분과 상관없이 고정된다. 즉, 이 문제는 1개의 선분만을 그려 모든 선분과 교차할 수 있는지 판단하고 가능하다면 그 선분을 어떻게 그릴 것인가를 구하면 해결된다. 문제 제목이 Single Cut of Failure인 것은 풀이에 대한 스포일러다.


입력으로 들어온 $N$개의 선분을 1차원 구간으로 펴서 $N$개의 구간으로 만들고 모든 구간과 교차하는 구간이 존재하는지 여부를 구해 답이 1개인지 확인하면 된다. 확인하는 과정에서 모든 구간과 교차하는 구간의 생김세 또한 구할 수 있다.


코드 보기


I. Triangles


입력으로 그림이 주어지면, 그림 안에 정삼각형의 개수를 세는 문제다.


우선, △ 모양의 삼각형의 개수만 세면 전체 정삼각형의 개수를 셀 수 있다. ▽ 모양의 삼각형은 전체 그림을 상하로 뒤집은 다음 △ 모양의 삼각형의 개수를 한 번 더 세는 방식으로 셀 수 있다.


△ 모양의 삼각형의 개수는 각 지점마다 오른쪽 위(/)로 변의 길이와, 왼쪽 위로(\)로 변의 길이를 칸 마다 계산해두고, Fenwick Tree와 Heap을 통해 계산할 수 있다. 풀이를 말로 풀어쓰기 복잡하여, 풀이는 코드를 참고하자.


코드 보기


'ICPC > World Finals' 카테고리의 다른 글

ACM ICPC World Finals 2018  (0) 2018.05.08
ACM ICPC World Finals 2016  (0) 2016.06.18
ACM ICPC World Finals 2015  (1) 2015.05.22
ACM ICPC World Finals 2011  (0) 2015.05.18
댓글
댓글쓰기 폼