https://www.acmicpc.net/problem/2615
2615번: 오목
오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호
www.acmicpc.net
저는 구현을 통해 문제를 해결하였습니다.
모든 지점에서 8방향으로 5개 연속으로 있는지를 판단하였습니다. 이때 문제점은 중간 지점으로 했을때 6목이 5목으로 판별될 수 있는데, 이를 이전 색을 확인하고 이 색이 지금 색과 같다면 판단하지 않도록 하였습니다.
문제에 가장 왼쪽 그리고 위에 있는 위치를 출력해야하기 때문에 위에서부터 아래로 먼저 왼쪽에서 오른쪽순으로 진행하였습니다.
package BOJ.etc;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_2615 {
private static final int SIZE = 19;
private static final int BLACK = 1;
private static final int WHITE = 2;
private static final int EMPTY = 0;
private static final int DRAW = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
Function<String,Integer> stoi = Integer::parseInt;
int[][] map = new int[SIZE+1][SIZE+1];
for(int i = 1 ; i <= SIZE ; i++){
st = new StringTokenizer(br.readLine());
for(int j = 1 ; j <= SIZE ; j++){
map[i][j] = stoi.apply(st.nextToken());
}
}
cal(map);
}
// private static final int[] DY = {-1,0,1,0,-1,1,1,-1};
// private static final int[] DX = {0,1,0,-1,1,1,-1,-1};
private static final int[] DY = {-1,0,1,1};
private static final int[] DX = {1,1,1,0};
private static void cal(int[][] map) {
for(int j = 1 ; j <= SIZE ; j++){
for(int i = 1 ; i <= SIZE ; i++){
if(map[i][j] == EMPTY){
continue;
}
for(int k = 0 ; k < 4 ; k++){
int result = check(i,j,k,map);
if(result != DRAW){
System.out.println(map[i][j]);
System.out.println(i+" "+j);
return ;
}
}
}
}
System.out.println(DRAW);
return;
}
private static int check(int y, int x, int dir, int[][] map) {
int color = map[y][x];
int prevY = y - DY[dir];
int prevX = x - DX[dir];
if(prevY >= 1 && prevY <= SIZE && prevX >= 1 && prevX <= SIZE && map[prevY][prevX] == color){
return DRAW;
}
int cnt = 0;
int ny = y;
int nx = x;
while(ny >= 1 && ny <= SIZE && nx >= 1 && nx <= SIZE && map[ny][nx] == color){
cnt++;
ny += DY[dir];
nx += DX[dir];
}
if(cnt == 5){
return color;
}
return DRAW;
}
}
'알고리즘' 카테고리의 다른 글
백준 7490번 0 만들기 (JAVA) (0) | 2023.10.29 |
---|---|
백준 18808번 스티커 붙이기 (JAVA) (1) | 2023.10.28 |
백준 1487번 물건 팔기 (JAVA) (0) | 2023.10.26 |
백준 13302번 리조트 (JAVA) (0) | 2023.10.25 |
백준 15624번 피보나치 수7 (JAVA) (1) | 2023.10.24 |