카테고리 없음

앳코더 ABC 446 후기

tkd0711 2026. 2. 21. 22:54

앳코더 ABC 446 후기

tkd0711 · 2026. 2. 21.

AtCoder Beginner Contest 446
https://atcoder.jp/contests/abc446

  • 결과: A~D AC (1000점)
  • D – Max Straight: 4트 AC

1. 전체 흐름

A, B는 무난하게 처리.
C도 크게 막히지 않고 해결.

문제는 D였다.

최종적으로는 AC했지만,
접근을 잘못 잡아서 60분 가까이 소비했다.


2. D – Max Straight

문제 요약

  • 수열 A
  • B는 subsequence
  • 조건:
    B_i + 1 = B_{i+1}
  • 최대 길이 구하기

3. 삽질 타임라인

1️⃣ 21:29 – LIS 착각 (WA)

문제를 대충 읽고
“subsequence + 증가”라고 생각해서
그냥 LIS로 접근했다.

하지만 조건은:

증가가 아니라 정확히 +1

여기서 이미 방향이 틀어졌다.


2️⃣ 21:59 – 2차원 DP (RE, 메모리 폭발)

값 범위가 1e9라 배열 dp를 못 쓰겠다고 생각하고
(idx, prvidx) 상태의 2차원 완탐 DP를 구현.

N ≤ 2×10^5인데
int[n][n] → 즉시 메모리 폭발 (약 900MB 사용)

여기서 문제를 인덱스 기준으로 본 것이 실수였다.


3️⃣ 22:08 – 이분탐색 + 완탐 (TLE)

길이에 대해 이분탐색하고
can(v)를 완전탐색으로 구현.

시간초과 날 걸 알면서도 일단 제출.

N=2e5에서 O(N² log N)은
애초에 불가능한 구조였다.


4️⃣ 22:30 – 정답 (HashMap DP)

담배 피면서 다시 생각.

이 문제는:

  • “이전 인덱스”가 중요한 게 아니라
  • “이전 값(a-1)”이 중요하다는 걸 깨달음

최종 풀이:

HashMap<Integer,Integer> map = new HashMap<>();
int max = 0;

for(int i = 0; i < n; i++){
    int cur = arr[i];
    int best = Math.max(map.getOrDefault(cur, 0),
                        map.getOrDefault(cur-1, 0) + 1);
    map.put(cur, best);
    max = Math.max(max, best);
}

값 기반 DP로 해결.


4. 왜 아쉬웠는가

이 문제는 사실 구조가 단순했다.

  • 정확히 +1 조건
  • 값 기반 연결
  • O(N) HashMap DP

처음에 조건을 정확히 읽고
“이건 LIS가 아니라 값 연결이네”만 했어도
20분 안에 풀 수 있었을 문제였다.

초반 10분을 템플릿으로 날린 게
오늘 가장 아쉬운 부분.


5. 한 줄 정리

오늘은 실력이 부족한 날이 아니라,
문제를 너무 빨리 결론 내린 날이었다.


솔직히 말하면,
점수는 1000점이지만 체감은 아쉬운 날이다.

그래도 D를 결국 스스로 구조 전환해서 풀어낸 건
분명 성장이다.