본문 바로가기

일기

BOJ 28039번 - 카드 게임 2

 

28039번: 카드 게임 2

근우와 명우는 재미있는 카드 게임을 하고 있다. N개의 카드가 일렬로 놓여 있다. 각 카드에는 점수가 적혀있다. 근우부터 시작하여 번갈아가면서 턴이 진행되는데 한 턴에는 가장 왼쪽에 있는

www.acmicpc.net

ICPC 인터넷 예선 2015 B번 문제에서 N 제한을 키운 문제이다.

기존 문제의 경우 O(N^2) dp 풀이가 가능하지만 이 문제의 최대 N은 1e6이다.

 

먼저 나는 이 문제를 풀지 못하였고 다른 사람의 코드를 보고 풀었음을 밝힌다.

엄밀한 증명 없이 대강 감만 잡은 상태에서 작성하는 글이기 때문에 잘못된 내용이 있을 수 있다.

잘못된 내용이 있다면 지적 부탁드립니다.

 

다음과 같은 배열 A를 정의하자.

A[i] = i번 카드에 적힌 수

배열 A의 값을 그래프로 그렸을 때 아래로 볼록한 모양이라고 가정해보자.

이 경우에는 two pointer로 그리디하게 최적해를 구할 수 있음을 쉽게 증명할 수 있다.

 

그렇다면 임의의 배열 A를 아래로 볼록한 모양으로 만들 수 있을까?

먼저 배열 A를 다음과 같이 재정의하자.

A[i] = i번 카드를 가져갔을 때 상대적인 이득

현재로서는 기존 정의와 별다를 바 없어 보인다.

 

편의를 위하여 배열 A의 모든 원소가 서로 다르다고 가정하자.

그리고 배열 A에서 임의의 인접한 세 원소 a, b, c를 선택하자.

배열 A가 아래로 볼록한 모양이려면 모든 a, b, c에 대하여 (b < max(a, c))를 만족하여야 한다.

따라서 이를 만족하지 않는, 즉 (b > max(a, c))를 만족하는 a, b, c를 모두 제거할 수 있다면 배열 A는 아래로 볼록해질 것이다.

 

이제 이를 제거하는 방법을 알아보자.

나와 상대방 모두 a와 c보다는 더 높은 점수를 가진 b를 원할 것이다.

내가 a 또는 c를 가져간다면 상대방은 b를 가져가는 것이 최선의 전략이다.

따라서 특별한 목적이 없다면 a와 c 모두 건드릴 이유가 없다.

 

하지만 일시적으로 손해를 보더라도 a(또는 c)를 가져가는 것이 이득이 될 수도 있다.

내가 a를 가져가면 상대방은 b를 가져가고 나는 c를 가져가는 것이 최선의 전략이다.

내가 c를 가져가지 않고서는 상대방에게 b를 순순히 넘겨줄 이유가 없다.

 

이때의 상대적인 이득을 계산하면 (a - b + c)가 된다.

따라서 (b > max(a, c))를 만족하는 인접한 세 원소 a, b, c를 (a - b + c)로 대체할 수 있다.

이 작업을 가능할 때까지 반복하면 배열 A를 아래로 볼록하게 만들 수 있으며 O(N)이 소요된다.

이제 위에서와 마찬가지로 two pointer로 그리디하게 최적해를 구할 수 있다.

이때 최종적으로 얻는 값은 "상대적인 이득"임에 주의해야 한다.

 

더 나은 설명이 가능하다면 댓글 부탁드립니다.

 

'일기' 카테고리의 다른 글

CP4 Chapter 3. Problem Solving Paradigms  (0) 2023.06.22
2023년 5월 30일 일기  (6) 2023.05.30
BOJ 1377번 - 버블 소트  (0) 2023.05.17
2023 우아한테크캠프 6기 1차 코딩테스트  (0) 2023.05.09
Ghudegy 정품 키  (0) 2023.04.30