https://leo630.tistory.com/92 이 글에서 이전 년도 PPC 문제들 풀이를 작성하기로 했었는데, 올해 대회가 3일 후이기 때문에 우선은 2018년도 대회 풀이를 써보려 한다. 2019년 대회는 쓰지 않을 예정인데, 아직 다 풀지도 않았고 + 뭔가..뭔가인 문제들이 좀 있고 + 무엇보다 에디토리얼이 있길래 생략하도록 하겠다. 우리 학교 대회인 만큼 평소 쓰던 풀이들보다는 정성들여 써보도록 하겠다.
A. Caesar Cipher
문제 소재로 자주 등장하는 카이사르 암호인데, 다른 문제들에 비해 까다로운 부분이 몇 군데 있다.
1. $k$의 크기가 크다. 이는 어떤 알파벳을 26번 밀면 다시 돌아온다는 것을 이용해, $k$를 26으로 나눈 나머지를 취한 후 진행해도 똑같은 결과를 얻을 수 있다.
2. 공백 포함 입력을 받아야 한다. 이는 아마 gets() 또는 getline(cin, s)와 같은 방법을 사용하면 될 것이다.
3. 대/소문자가 모두 들어올 수 있다. if문으로 잘 판별해주자.
위와 같은 사항을 모두 고려해주면 정답을 받을 수 있다.
B. Pineapple Farming
웅덩이가 되는 부분을 "물", 웅덩이보다 높은 부분들을 "육지"라 하자.
물과 육지가 되는 경계 높이는 항상 주어진
따라서
생각을 해 보면, 어떤 경계에서 BFS를 돌린 후 다음 경계로 넘어갈 때 BFS를 새로 돌리는 것은 비효율적이다.
해당하는 높이의 칸만 근처 컴포넌트에 연결해주면 되기 때문이다. 이는 Union-Find를 이용해 처리할 수 있다.
따라서, 낮은 높이의 칸부터 보며 Union-Find를 이용해 연결해주되, 바깥과 연결되어 있지 않은 컴포넌트의 크기 중 최댓값을 계속 구해주면 된다. 같은 높이인 칸이 있을 경우 구현할 때 주의해줘야 할 부분이 있으니 이에 유의하며 구현해주자.
C. Binary Counting
무난한 구현 문제이다. 제한이 작아 대충 구현해도 정답을 쉽게 맞을 수 있다.
문제에 해야 하는 것이 다 적혀 있고, 쉬운 문제이므로 자세한 풀이법은 생략하도록 하겠다.
D. Apples and Bananas
갑자기 영어가 등장해 사람을 당황시키는 문제이다. 요약하자면, Alice와 Bob이 게임을 하는데 각 플레이어는
1) 사과 하나 제거 2) 바나나 하나 제거 3) 사과 하나, 바나나 세 개 제거 4) 사과 세 개, 바나나 하나 제거
중 하나의 행동을 번갈아가며 할 수 있다. 마지막 과일을 제거하는 사람이 승리한다.
처음 상태에서의 사과와 바나나의 개수가 주어질 때, 승자를 출력하는 문제이다.
비슷한 형태의 게임 DP에 익숙한 사람이라면 문제를 쉽게 해결할 수 있다.
E. Pineapple Pizza
기하 문제이다. 이 역시 기하에 익숙한 사람이라면 쉽고, 그렇지 않으면 어려울 것이다.
우선, 점 Q를 원점으로 생각해 360도 각도 정렬을 한 후, 같은 동경을 가지는 점들을 묶어주자.
이후 각 각도를 시작점으로 한다고 가정한 후, 그리디하게
시간 복잡도는
F. Edge Coloring
간단해 보이지만, 많이 어려운 문제이다. 다행인 것은, 제한이 작아 일단 풀이를 찾는 데에 집중해도 된다는 점이다. 문제에서 요구하는 사항을 자세히 살펴보자.
첫째로, 그래프의 각 component는 독립적으로 생각할 수 있다. 따라서 연결 그래프라 가정하고 문제를 해결하자.
또한, edge를 하나 색칠할 때마다 문제에서 요구하는 값의 총량이 2씩 증가하므로 문제에서 요구하는 값의 총량은 항상 짝수여야 한다. 이 때,
우선,
여러 방법이 가능하지만, 가장 간단한 방법은 모든 정점 쌍에 대해 경로를 지나는 모든 간선의 색칠 여부를 반전시키는 연산을 시행하는 것이다.
한 경로에 대해 이를 시행할 경우 시작과 끝 정점에 대한 홀짝성만 바뀌는데,
이제 트리에서 간선이 하나씩 추가되는 상황을 보자.
조건을 만족하는 트리에 간선이 하나 추가된다면, 추가된 간선을 색칠하지 않거나, 추가된 간선을 색칠한 후 기존 경로를 반전시키는 두 가지 경우가 가능하다.
즉, 원래 그래프에서 사이클을 골라 반전시키는 것은 여전히 조건을 만족한다. 따라서, 이 문제는 그래프에서 사이클을 적절히 선택하는 경우의 수를 묻는 문제가 된다. 사이클의 개수는
G. Turf Wars
각 영역을 포기했는지에 대한 여부를
한
겹치는 두 영역에 대해 최소 하나는 포기되어야 하니
이를 모두 추가한 후 2-SAT을 돌리면 문제를 해결할 수 있다.
H. Pen Pineapple Apple Pen
그냥 구현 문제이다. 연속된 경우만 세면 되므로 편하게 짜면 된다.
pPAp가 하나 발견되면 마지막 p 이후로 건너뛰는 것을 반복해주자.
I. Line of Bentham
각 사람이 뒤 3사람에게만 영향을 받는다는 점을 주목하자.
J. First In Last Out
보기 쉽지 않은 Output Only 문제이다. 뭘 해야 하는지는 문제에 잘 나와 있고, 10진수였어도 귀찮았을게 16진수라 더 귀찮다.
위 숫자들만 정해주면 STACK에 해당하는 숫자들은 자동으로 정해지니 이를 잘 구현해보자.
'PS > 기타' 카테고리의 다른 글
SCPC 본선 후기는 (8) | 2023.09.16 |
---|---|
일기 (짧음) (0) | 2023.06.19 |