CS & Algorithm
[백준 / Java] 2615번: 오목 (브루트포스)
whatdoyumin
2025. 2. 6. 15:48
오늘의 코테99 14일차 문제는 백준 2615번 '오목'이었다.
문제 이해
- 검은 바둑알은 1, 흰 바둑알은 2, 알이 놓이지 않은 자리는 0으로 입력된다.
- 가로, 세로, 대각선 방향에 연속적으로 5개가 놓아지면 이기게 된다.
- 이긴 돌이 있는 경우 돌의 색 (1 혹은 2)과 가장 왼쪽에 있는 돌의 좌표가 출력되고, 승부가 결정되지 않으면 0이 출력된다.
알고리즘 진행 순서
- 입력받은 바둑 돌을 배열에 저장한다.
- 19 x 19 보드판을 모두 돌면서 1(흑돌) 혹은 2(백돌)일 경우 네 방향(→, ↓, ↘, ↙) 탐색하여 같은 색을 찾고,
- 같은 색일 경우 연속된 돌의 개수(count)를 증가시킨다.
- 이후 count가 5가 되면 이긴 플레이어를 출력한다.
구현 코드
package Boj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Boj2615 {
static int[][] board = new int[20][20];
static int[] dx = {0, 1, 1, -1};
static int[] dy = {1, 0, 1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 19; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 19; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
if (board[i][j] == 0) continue;
int player = board[i][j];
for (int k = 0; k < 4; k++) {
int count = 1;
// 현재 위치 index 값
int nx = i, ny = j;
while (true) {
nx += dx[k];
ny += dy[k];
// 예외 처리 (보드판을 벗어나거나, 현재 플레이어와 색이 다를 경우)
if (nx < 0 || ny < 0 || nx >= 19 || ny >= 19 || board[nx][ny] != player) break;
count++;
if (count == 5) {
// 6목 이상일 경우 예외 처리
int px = i - dx[k];
int py = j - dy[k];
int qx = nx + dx[k];
int qy = ny + dy[k];
if ((px < 0 || py < 0 || px >= 19 || py >= 19 || board[px][py] != player) &&
(qx < 0 || qy < 0 || qx >= 19 || qy >= 19 || board[qx][qy] != player)) {
sb.append(player).append("\n");
sb.append(i + 1).append(" ").append(j + 1);
System.out.println(sb);
return;
}
}
}
}
}
}
System.out.println(0);
}
}
회고
- 처음 StringTokenizer를 한 번만 선언했더니 NoSuchElementException 에러가 발생했다. 이후 한 줄마다 StringTokenizer를 선언했더니 해결되었다. 다음부터 여러 줄을 입력받으려 할 때 줄마다 StringTokenizer를 호출하는 것을 인지하도록 해야겠다.
- 보드판의 범위 예외 처리에서 nx > 19로 구현했는데, 계속 '틀렸습니다'가 떠서 다시 살펴보니 인덱스는 18까지만 살펴봐야 하므로 nx >= 9가 맞았다.
- 5목이 될 경우 바로 사용자를 출력했지만, 6목 이상이 될 경우를 예외 처리하지 않았다. 그래서 '틀렸습니다'가 떴다.
- 마지막으로 승부가 나지 않았을 때 0을 출력해야 하는데, 이것도 빼먹어서 '틀렸습니다'가 떴다.
- 오늘은 예외 처리에 신경쓰지 못해서 생기는 문제가 많았다. 앞으로는 꼼꼼히 살펴보도록!