[백준 23823] 초코칩케이크 [Java]
2025. 12. 14. 15:34ㆍPS 풀이/Baekjoon Online Judge
문제
23823번: 초코칩 케이크
boj.ma
요약
- 한 행/열의 모든 조각에 초코칩을 1개씩 올릴 때, 초코칩이 가장 많이 있는 조각의 수를 구하자.
- $n ≤ 3e4, q ≤ 1e5$
풀이 과정
아이디어
케이크의 모든 조각에 초코칩을 올리는 갱신 과정 $O(nq)$이므로 시간 초과가 발생한다.
임의의 칸(i, j)에 있는 초코칩 개수는
- R[i] : i 번째 가로 줄에 초코칩을 올린 횟수
- C[j] : j 번째 세로 줄에 초코칩을 올린 횟수
의 합으로 표현할 수 있다.
따라서 초코칩이 가장 많이 놓인 조각의 수는 R[i]와 C[j]가 최대인 교차점이 된다.
각 쿼리마다 R[i] + C[j] = maxRow + maxCol를 만족하는 칸의 수를 구하면 되며, 이는 maxRow인 행의 수 * maxCol인 열의 수로 나타낼 수 있다.
만약 행 또는 열 쿼리가 없을 수 있으므로, maxRowCount, maxColCount는 N으로 초기화해 동일한 식으로 처리하자.
int[] R = new int[N + 1], C = new int[N + 1];
int maxRow = 0, maxCol = 0;
int maxRowCount = N, maxColCount = N;
- R[a]에 초코칩을 올리는 횟수를 증가시키고,
- R[a]가 초코칩이 최대로 올라간 조각(maxRow)와 수가 동일하다면 교차점(maxRowCount)을 증가시켜주자.
- 만약 R[a]가 기존에 초코칩이 최대로 올라간 조각보다 더 많이 올라갔다면, 새로운 교차점이 형성되야 한다.
// Solve
if (t == 1) {
++R[a];
if (R[a] == maxRow) {
++maxRowCount;
} else if (R[a] > maxRow) {
maxRowCount = 1;
maxRow = R[a];
}
} else {
/* 행과 열에 대한 로직은 동일하다. */
}
성능 분석
- 시간 복잡도: $O(Q)$
- 제출결과: Accepted / 488ms / 23,823KB
회고
행과 열을 직접 갱신하지 않고, 상태를 축약해 표현하는 방식은 구현보다는 과정을 이해하고 표현하는 개념적 과정이 어려웠다.
이로 인해 변수명이 의도를 정확히 전달하는지에 대해 많은 고민을 하게 되었고, 그 과정에서 전체 로직을 다시 점검하며 논리적 문제를 사전에 제거하는 습관의 중요성을 다시 한 번 느끼게 되었다.
참고
문제
소스코드
https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/normal/23823.java
'PS 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
| [백준 23792] K번째 음식 찾기 2 [Java] (0) | 2025.12.16 |
|---|---|
| [백준 25393] 교집합 만들기 [Java] (0) | 2025.12.07 |
| [백준 34817] 쉬운 정렬 문제 [Java] (0) | 2025.12.06 |
| [백준 11944] NN [Java] (0) | 2025.12.01 |
| [백준 12946] 육각 보드 [Java] (0) | 2025.11.29 |