포스트

[Atcoder] AtCoder Beginner Contest 397 후기

서론

이번에도 A,B,C는 수월하게 풀었지만, D~부터는 역시 벽을 느낀 콘테스트였습니다.

Problem

A

단순히 if문 분기처리를 하는 문제였습니다.

B

문자열이 주어지면 ioioio… 형태로 만들기 위해 해야하는 최소한의 동작을 구하는 문제인데,

상태를 잘 정의하면 반복문 하나로 풀 수 있는 문제였습니다.

C

배열을 둘로 나눴을 때 각 배열에서 구분되는 숫자의 개수를 최대화하는 문제였습니다.

이 문제 또한 for문을 진행하면서 max값을 구할 수 있습니다.

D

어떤 정수 $N$(long long 범위)가 주어지면, $y^3 - y^3 = N$을 만족하는 $x$와 $y$를 아무거나 찾는 문제였습니다.

정석적인 풀이는 $x^3 - y^3 = (x-y)(x^2 + xy + y^2)$를 잘 변형해서 푸는 겁니다.

여기서 핵심적인 아이디어는 $d = x - y$를 정의하는 겁니다.

그러면 $N$의 약수를 $d$라고 치고 약수에 대해 브루트포스 및 이분탐색을 하면 풀리는 문제인데.

오버플로우에 대해 해결을 못하기도 했고, 무엇보다 이분 탐색을, 구현은 쉽게 하는데 정밀하게는 구현을 못해서,, 아쉬웠던 문제입니다.

번외로 투 포인터를 이용한 브루트-포스 방식으로도 문제가 풀려서 신기했습니다. 딱 시간제한에 걸린 코드..

E

주어진 트리의 정점들을 $N×K$ 행렬 형태로 분할하여, 각 행이 길이 $K$인 경로를 이루고 모든 정점이 정확히 한 번씩 등장하도록 할 수 있는지 판별하는 것이라고는 합니다.

(문제 구상도 안해봤습니다.)

F

C문제를 2개로 쪼개는게 아닌 3개로 쪼개는 문제입니다.

시간복잡도가 $O(n^2)$이 나오면 안되서, 뭔가 세그먼트 트리같은걸 써서 풀어야 한다는 아이디어만 도달한 문제였습니다.

에디토리얼에서는 DP와 lazy-SegmentTree를 이용해서 구현하는 문제였습니다.

lazy-SegmentTree? 도 한번 공부해볼 예정입니다.

G

최소 컷 문제로 바꿔 푸는 건데, 아직은 이걸 풀기에는 가야할 길이 너무 멉니다..

정리

D번 문제에 대해 오버플로우를 해결만 했다면 풀었을 텐데.. 아쉬움이 남습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.