2026. 1. 3. 16:44ㆍPS 풀이/Baekjoon Online Judge
문제
요약
- N * N 배열에 C, E개의 공간을 서로 인접하지 않도록 배치하자.
- 만약 배치할 수 없다면 - 1을 출력하자.
풀이 과정
아이디어
두 종류의 공간을 최대한 겹치지 않게 배치하기 위해서는, 각 공간에 인접하는 빈 영역이 최소가 되도록 배치해야 한다.
좀 더 구체적으로는 아래와 같이 규칙을 세울 수 있다.
- 배열의 경계선에 최대한 붙이며
- 인접한 빈 영역의 수를 최소화
따라서 각 공간은 밀집되어야 하지만, 공간 간에는 최대한 배척해야 한다.
수평/수직 구조 보다, 계단형식으로 공간을 구성하는 것이 합리적이다.
- 임의의 모서리를 정하고
- 중앙을 향한 가상의 선분에 수직 방향으로 배치하면 된다.
- 나머지 영역은 마주보는 방향의 모서리에서
- 반대 방향으로 배치하면 된다.
그림으로 나타내면 아래와 같다.

private static boolean solve(int C, int E) {
if (N * N <= C + E) {
return false;
}
fillA(C);
return fillB(E);
}
private static void fillA(int cnt) {
for (int i = 0; i < 2*N; ++i) {
for (int j = 0; j <= i; ++j) {
int r = i - j;
if (r >= N || j >= N) {
continue;
}
board[r][j] = 1;
if (--cnt == 0) {
return;
}
}
}
}
private static boolean fillB(int cnt) {
for (int i = N - 1; i >= -N; --i) {
for (int j = N - 1; j >= i; --j) {
int r = i + (N - j - 1);
if (r < 0 || j < 0) {
continue;
}
if (board[r][j] == 1 ||
(j > 0 && board[r][j - 1] == 1) ||
(r > 0 && board[r - 1][j] == 1)) {
return false;
}
board[r][j] = 2;
if (--cnt == 0) return true;
}
}
return false;
}
구현의 단순함을 위해 탐색 범위는 $2N^2$ 으로 하고, 유효한 범위에서만 배치하도록 구현했다.

만약 B를 채우다가. 인접한 영역에 A가 있다면 유효한 배치가 존재하지 않은 경우로, -1을 출력하면 된다.
성능 분석
- 시간 복잡도: $O(N^2)$
- 제출결과: Accepted / 108ms / 14,388KB
회고
계단 형식으로 영역을 배치하는 로직을 구현하는 과정에서, 습관적으로 탐색 범위를 N으로 제한한 채 구현해 일부 영역이 끝까지 배치되지 않는 오류가 발생했다.
이 문제는 실제로도 원인을 파악하는 데 상당한 시간이 걸렸고, 풀이 글을 작성하며 다른 사람이 이해할 수 있도록 구조를 정리하고 시각 자료를 만들던 과정에서 놓치고 있던 조건을 발견할 수 있었다.
결과적으로 설명하는 과정 자체가 디버깅의 역할을 했고, 혼자서만 코드를 들여다볼 때보다 사고의 맹점을 더 빠르게 드러내 주었다.
앞으로도 문제를 풀다가 원인을 쉽게 찾기 어려운 경우, 해결 과정을 스스로에게 설명하며 다시 검증하는 습관을 유지해야겠다고 느꼈다.
참고
문제
24727번: 인지융~
boj.ma
소스코드
https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/normal/24727.java
problem-solving/baekjoon-online-judge/normal/24727.java at main · rogi-rogi/problem-solving
Daily Problem Solving Challenges. Contribute to rogi-rogi/problem-solving development by creating an account on GitHub.
github.com
'PS 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
| [백준 16236] 아기 상어 [Java] (0) | 2026.01.05 |
|---|---|
| [백준 02089] -2진수 [Java] (0) | 2026.01.04 |
| [백준 23792] K번째 음식 찾기 2 [Java] (0) | 2025.12.16 |
| [백준 23823] 초코칩케이크 [Java] (0) | 2025.12.14 |
| [백준 25393] 교집합 만들기 [Java] (0) | 2025.12.07 |