[Algorithm/Java] SWEA 11315번 - 오목 판정
🔍 문제 풀이
문제 도식화
풀이 방법
연속된 칸을 검사하는 두 가지 방법
오목 판정 문제처럼 2차원 배열에서 특정 방향으로 연속된 칸을 검사할 때, 보통 아래 두 가지 방식 중 하나를 사용한다.
// 기준 좌표에서 k칸 떨어진 위치를 계산하는 방식
for (int k = 0; k < 5; k++) {
int nx = x + dx[d] * k;
int ny = y + dy[d] * k;
...
}
// 현재 좌표를 누적 이동시키는 방식
int nx = x, ny = y;
for (int k = 0; k < 5; k++) {
...
nx += dx[d];
ny += dy[d];
}
x + dx[d] * k
방식은 반복문 변수 k만으로 이동 좌표를 계산할 수 있기 때문에 이 방식을 선택했다.
💻 전체 코드
import java.io.*;
public class Solution {
static int n;
static char[][] arr;
static int[] dx = {1, 1, 1, 0};
static int[] dy = {-1, 0, 1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for(int tc=1; tc<=t; tc++){
// 입력 및 초기화
n = Integer.parseInt(br.readLine());
arr = new char[n][n];
for(int i=0; i<n; i++){
String line = br.readLine();
for(int j=0; j<n; j++){
arr[i][j] = line.charAt(j);
}
}
// 함수 호출
boolean found = false;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(arr[i][j] == 'o' && check(i, j)){
found = true;
break;
}
}
}
print(tc, found);
}
}
static boolean check(int x, int y){
for(int d=0; d<4; d++){
int cnt = 0;
for(int z=0; z<5; z++){
int nx = x + dx[d] * z;
int ny = y + dy[d] * z;
if(nx < 0 || nx >= n || ny < 0 || ny >= n) break;
if(arr[nx][ny] == 'o') cnt++;
}
if(cnt >= 5) return true;
}
return false;
}
static void print(int tc, boolean found){
StringBuilder sb = new StringBuilder();
sb.append("#").append(tc).append(" ");
if(found) sb.append("YES");
else sb.append("NO");
System.out.println(sb);
}
}
댓글남기기