

-Code
import java.io.*;
import java.util.*;
public class BOJ2615 {
static class PlayInfo {
int color, row, col;
public PlayInfo(int color, int row, int col) {
this.color = color;
this.row = row;
this.col = col;
}
}
// 오른쪽, 아래, 좌하향, 우하향 검사
static int[] dRow = {1, 0, 1, 1};
static int[] dCol = {0, 1, -1, 1};
static int[][] baduk;
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
baduk = new int[20][20];
for (int r = 1; r <= 19; r++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int c = 1; c <= 19; c++) {
baduk[r][c] = Integer.parseInt(st.nextToken());
}
}
PlayInfo winner = null;
for (int r = 1; r <= 19; r++) {
for (int c = 1; c <= 19; c++) {
// 빈공간이 아닌 경우
if (baduk[r][c] != 0) {
// 승자 확인
PlayInfo nowWinInfo = whoWin(baduk[r][c], r, c);
// 승자가 있으면 승자 셋팅
if (nowWinInfo != null) {
winner = nowWinInfo;
}
}
}
// 승자가 있으면 탈출
if (winner != null) {
break;
}
}
// 승자가 없으면 0 반환
if (winner == null) {
System.out.println(0);
} else {
// 승자가 있는 경우 색과 맨 왼쪽의 위치 반환
System.out.println(winner.color);
System.out.println(winner.row + " " + winner.col);
}
}
private static PlayInfo whoWin(int color, int row, int col) {
for (int i = 0; i < 4; i++) {
// 이전 바둑돌 검사
int prevRow = row - dRow[i];
int prevCol = col - dCol[i];
// 해당 바둑돌이 현재와 같은경우 6목 방지를 위한 검사
if (isMove(prevRow, prevCol) && baduk[prevRow][prevCol] == color) {
continue;
}
// 현재 시작점 값으로 갯수 초기화
int cnt = 1;
int nowRow = row, nowCol = col;
while (true) {
// 다음 위치 셋팅
nowRow += dRow[i];
nowCol += dCol[i];
// 범위 벗어나거나 돌이 아닌 경우
if (!isMove(nowRow, nowCol) || baduk[nowRow][nowCol] != color) {
// 마지막 위치 셋팅
nowRow -= dRow[i];
nowCol -= dCol[i];
break;
}
// 같은 색이면 연결 갯수 +1
cnt++;
}
// 오목 완성인 경우
if (cnt == 5) {
// 좌하향인 경우 맨 왼쪽 돌이 마지막 돌임
if (i == 2) {
return new PlayInfo(color, nowRow, nowCol);
}
// 좌하향이 아닌 경우 시작점이 맨 왼쪽 돌임
return new PlayInfo(color, row, col);
}
}
// 승자 없는 경우 null
return null;
}
// 이동 가능한 위치 확인
private static boolean isMove(int row, int col) {
return (1 <= row && row < 20) && (1 <= col && col < 20);
}
}
최근에 BFS 문제를 많이 접하다 보니 BFS로 풀려고 하였고 그로 인해 움직이는 방향이라던지 이상하게 세팅을 해서 풀어서 문제가 생겼습니다. 알고 보니 그냥 구현하는 문제이고 방향도 아래로 뻗어나가도록 세팅하는 것으로 힌트를 얻고 구현했습니다.
하지만 추가적인 문제가 생겼는데 6목 문제와 좌햐향 방향의 경우의 문제도 있었습니다. 6목과 같은 경우 같은 방향으로 이전 위치에 같은 색상이 있는 경우 넘어가도록 하여 해결할 수 있었고, 좌하향 같은 경우는 while문 탈출시 마지막 같은 색인 경우 위치정보로 세팅하고 오목인 경우 해당 값을 반환하도록 하여 해결했습니다.
문제를 보고 방향을 가지고 이동하는 방식의 설계는 맞았으나 사용 알고리즘이나 세세한 조건 처리에 대해서 실수 및 깨닫지 못해서 많이 힌트를 얻으려고 찾아보아 아쉬웠습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 2668번 숫자고르기 (0) | 2026.02.11 |
|---|---|
| [백준/Java] 16337번 Die (0) | 2026.02.11 |
| [프로그래머스/Java] 햄버거 만들기 (0) | 2026.02.10 |
| [백준/Java] 5052번 전화번호 목록 (0) | 2026.02.10 |
| [백준/Java] 12981번 공 포장하기 (0) | 2026.02.10 |