앳코더 ABC 455 후기
tkd0711 · 2026. 4. 25.
Sky Inc, Programming Contest 2026 (AtCoder Beginner Contest 455)
https://atcoder.jp/contests/abc455
- 날짜: 2026-04-25 (Sat)
- B가 가장 오래 걸림
- C는 비교적 바로 해결
- D는 18분 정도 걸려 해결
1. 전체 느낌
이번 대회는 전체적으로 보면 A는 무난했고,
B에서 예상보다 크게 말렸다.
C는 문제를 보자마자 방향이 바로 보이는 편이었고,
D는 처음엔 조금 관찰이 필요했지만 구조를 본 뒤에는 비교적 빠르게 정리했다.
특히 이번 대회는
어려운 알고리즘을 몰라서 막혔다기보다는,
- B에서 문제를 처음 잘못 읽은 것
- 단순 완전탐색을 의심하느라 시간을 더 쓴 것
이 두 가지가 가장 아쉬웠다.
2. A – 무난한 시작
A는 큰 문제 없이 넘어갔다.
이제 A는 예전처럼 긴장되는 구간이라기보다
초반 흐름을 잡는 문제라는 느낌이 더 강하다.
이번에도 스타트 자체는 나쁘지 않았다.
3. B – 문제를 잘못 읽고, 할 수 있는 완전탐색을 의심해서 시간 손해
문제 요약
격자에서 직사각형 구간을 하나 잡았을 때,
그 구간이 점대칭으로 같은 색 배치를 이루는지 확인하고
그런 직사각형 개수를 세는 문제였다.
제한은 H, W ≤ 10이었다.
처음 꼬인 이유
처음 문제를 잘못 읽었고,
그 뒤에 완전탐색으로 가면 될 것 같은데도
“이게 진짜 6중 반복문으로 되는 게 맞나?”를 의심하면서 시간이 더 갔다.
실제로는 제한이 매우 작아서,
- 직사각형의 위쪽
- 아래쪽
- 왼쪽
- 오른쪽
을 전부 정하고,
그 안의 각 칸이 점대칭 위치와 같은 색인지 확인하면 되는 문제였다.
즉, 구현은 길어 보여도
제한이 작기 때문에 그냥 밀어붙이면 되는 문제였다.
왜 더 아쉬웠는가
이 문제는 아이디어가 어려운 게 아니었다.
- 처음에 문제를 잘못 읽은 것
- 그 뒤에 할 수 있는 완전탐색을 스스로 의심한 것
- 디버깅하다가 흐름이 꼬인 것
이 세 가지가 겹쳐서 시간이 많이 들었다.
회고를 하면서 느낀 건,
이런 문제는 “이게 진짜 되나?”를 오래 고민할수록 손해라는 것이다.
제한이 충분히 작으면
애매하게 의심하기보다 그냥 구현하는 쪽이 나았다.
교훈
이번 B의 핵심 교훈은 이거였다.
제한이 아주 작을 때는
완전탐색을 괜히 불안해하지 말고 먼저 구현해보는 편이 낫다.
특히 이번처럼 H, W ≤ 10이면
반복문 개수가 많아 보여도 실제 연산량은 충분히 가능할 수 있다.
4. C – 바로 보이는 문제는 깔끔하게 처리하자
문제 요약
수열에서 값을 하나 골라,
그 값을 가진 모든 원소를 0으로 바꾸는 연산을 정확히 K번 했을 때
전체 합의 최솟값을 구하는 문제였다.A_i의 값 범위는 최대 10^9라서 배열 대신 다른 구조가 필요했다.
접근
이 문제는 비교적 바로 보였다.
핵심은 같은 값을 한 번 고르면
그 값을 가진 원소들이 전부 0이 된다는 점이다.
즉 중요한 건 각 값이 몇 번 나왔는지가 아니라,
그 값이 전체 합에 얼마를 기여하는지였다.
그래서:
- 해시맵으로 각 값별 총합을 모은다.
- 그 총합이 큰 값부터
K개 없앤다. - 나머지 총합을 더하면 답이 된다.
이 방식으로 해결했다.
느낀 점
이 문제는 숫자 범위가 크기 때문에
배열 대신 해시맵을 써야 한다는 점만 바로 잡으면 비교적 단순했다.
즉,
- 값 범위가 크다 → 배열 대신 해시맵
- 같은 값은 한 번에 사라진다 → 값별 총합만 보면 된다
이렇게 정리하면 금방 풀 수 있었다.
5. D – 관찰이 되자마자 구조가 보였던 문제
문제 요약
카드 더미들이 있고,
어떤 카드 C_i와 그 위의 카드 전부를
다른 카드 P_i 위로 옮기는 연산을 반복한 뒤,
최종적으로 각 더미의 카드 수를 구하는 문제였다.
처음 생각
처음엔 링크드 리스트처럼 구현하면 되겠다고 봤다.
왜냐하면 이 문제는 실제로 필요한 정보가:
- 내 위에 누가 있는지
- 내 아래에 누가 있는지
- 어떤 카드가 더미의 맨 위인지
이런 연결 정보였기 때문이다.
즉 배열 여러 개로
- 위쪽 연결
- 아래쪽 연결
- 머리 카드 여부
를 관리하면 될 것 같다고 생각했다.
핵심 관찰
문제를 조금 보고 나서a와 b의 관계를 정리하니까 구조가 금방 보였다고 느꼈다.
카드를 옮긴다는 것은 결국
중간 연결을 끊고 다시 이어 붙이는 작업이다.
그래서 실제 카드 순서를 전부 시뮬레이션하는 것이 아니라,
연결만 바꾸면 된다고 볼 수 있었다.
구현
구현에서는 카드들의 위/아래 관계를 배열로 관리하고,
모든 연산이 끝난 뒤 각 더미의 머리 카드에서부터 아래로 따라가며 카드 수를 세는 방식으로 정리했다.
느낀 점
D는 처음엔 조금 관찰이 필요했지만,
핵심 구조를 본 뒤에는 비교적 빨리 해결할 수 있었다.
이번 D에서 좋았던 건
괜히 복잡한 자료구조를 찾기보다
“이건 연결 관계만 관리하면 된다”는 쪽으로 정리한 점이었다.
6. 이번 대회에서 좋았던 점
1) C, D는 비교적 잘 풀었다
C는 빠르게 구조를 잡았고,
D도 관찰 뒤에는 비교적 빨리 정리했다.
2) 값 범위가 큰 문제에서 해시맵을 자연스럽게 떠올렸다
C에서 배열 대신 해시맵으로 가는 판단은 좋았다.
3) D에서 연결 구조로 보는 감각이 있었다
카드 쌓기 문제를 순수 구현으로 보기보다
연결 관계 문제로 바꿔 본 게 괜찮았다.
7. 아쉬웠던 점
가장 아쉬운 건 역시 B였다.
- 처음 문제를 잘못 읽었고
- 완전탐색을 의심하다가 시간을 더 썼고
- 디버깅하다가 흐름까지 꼬였다.
즉 이번 대회는
문제를 몰라서 못 푼 느낌보다는,
할 수 있는 문제를 괜히 의심해서 시간을 더 쓴 대회
에 가까웠다.
8. 다음 목표
- 제한이 작은 문제에서는
반복문 개수가 많아 보여도 실제 연산량을 먼저 계산해보기 - 완전탐색이 가능하면
괜히 겁먹지 말고 바로 구현하기 - 문제를 처음 잘못 읽었을 때
코드만 고치지 말고 문제 모델부터 다시 보기 - 연결 관계 문제는
실제 시뮬레이션보다 포인터/배열 연결로 바꿔 볼 것
한 줄 정리
ABC 455는 B에서 괜히 완전탐색을 의심하며 시간을 쓴 것이 가장 아쉬웠고,
C와 D는 구조를 비교적 잘 잡아서 해결한 대회였다.