1 분 소요



11315. 오목 판정



🔍 문제 풀이

문제 도식화

assets/images/2025/11315. 오목 판정.png


풀이 방법

연속된 칸을 검사하는 두 가지 방법

오목 판정 문제처럼 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);
    }
}


카테고리:

업데이트:

댓글남기기