[ Solution ]
package implement2615;
import java.io.*;
import java.util.*;
public class Main {
static int[][] arr = new int[19][19];
static int[] dr = {-1, 0, 1, 1, 1, 0, -1, -1}; // 0-3번째는 조건 방향, 4-7번째는 조건 외 방향
static int[] dc = {1, 1, 1, 0, -1, -1, -1, 0}; // 0-3번째는 조건 방향, 4-7번째는 조건 외 방향
static int count = 0; // 바둑알 세는 변수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int success = 0; // 오목 성공 여부 판별 변수
for(int i = 0; i < 19; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j = 0; j < 19; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
logicfor: for(int i = 0; i < 19; i++) {
for(int j = 0; j < 19; j++) {
if(arr[i][j] == 1 || arr[i][j] == 2) {
for(int k = 0; k < 4; k++) { // 방향 지정
count = 1; // arr[i][j] 하나 먹고 시작
if(check(k, arr[i][j], i, j) == 5 && !checkPrev(k+4, arr[i][j], i, j)){ //같은 바둑 알이 5개 이고, 6개 이상이 아닌지 판별
System.out.printf("%d\n%d %d", arr[i][j], i+1, j+1);
success = 1; // 성공으로 바꿔주기
break logicfor;
}
}
}
}
}
//실패 했을 때
if(success != 1){
System.out.println(0);
}
}
// 6개 이상인지 아닌지 판별
static boolean checkPrev(int k, int player, int i, int j) {
return 0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player;
}
// 같은 바둑알이 5개인지 판별
static int check(int k, int player, int i, int j) {
if(k == 0) {
if(0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player) {
count++; // 바둑알 증가
check(k, player, i+dr[k], j+dc[k]); // 같은 방향의 다음 바둑알에 대해서도 판별
}
else {
return count;
}
}
else if(k == 1) {
if(0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player) {
count++;
check(k, player, i+dr[k], j+dc[k]);
}
else {
return count;
}
}
else if(k == 2) {
if(0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player) {
count++;
check(k, player, i+dr[k], j+dc[k]);
}
else {
return count;
}
}
else if(k == 3) {
if(0<=i+dr[k] && i+dr[k]<19 && 0<=j+dc[k] && j+dc[k]<19 && arr[i+dr[k]][j+dc[k]] == player) {
count++;
check(k, player, i+dr[k], j+dc[k]);
}
else {
return count;
}
}
return count;
}
}
평소에 오목도 좋아해서,, ㅎㅎ 재미있게 풀었던 문제이다.
문제에서 중요한 조건이 있는데 '알이 여섯알 이상 놓였을 경우 이긴 것이 아니다'라는 것이다.
그래서 그 조건에 대해서도 고려하기 위해서는 한 방향에 대해서 같은 색깔의 오목 알이 5개가 있는지 체크하고, 바로 반대방향에 대해서 같은 색깔의 오목 알이 없는지 체크해야 해야 한다.
방향을 인덱스 값으로 잘 표현하는 것이 이 문제의 핵심이라고 생각한다.