본문 바로가기

알고리즘(백준 등) 공부

SWEA 11315. 오목 판정

N x N 크기의 오목판에 돌이 가로, 세로, 대각선 중 하나의 방향으로 5개이상 연속되어 있는지 확인하는 문제이다.

 

돌이 놓인 부분부터 시작해서 가로와 세로는 증가하는 방향으로 확인하고 대각선은 전부 증가하는 방향과 x 좌표는 감소하고 y좌표는 증가하는 방향으로 확인하였다. 확인하기 전 index 범위를 벗어나는지 먼저 검증해야 한다.

private static boolean isExist(char[][] board, int n, int r, int c) {
    boolean isPossible = true; 
        
    if(r <= n-5) {
        for(int i=1; i<=4; i++) {
            if(board[r+i][c] == 'o') continue;
            isPossible = false;
            break;
        }
        if(isPossible) return true;
    }
    if(c <= n-5) {
        isPossible = true;
        for(int i=1; i<=4; i++) {
            if(board[r][c+i] == 'o') continue;
            isPossible = false;
            break;
        }
        if(isPossible) return true;
    }
    if(r <= n-5 && c <= n-5) {
        isPossible = true;
        for(int i=1; i<=4; i++) {
            if(board[r+i][c+i] == 'o') continue;
            isPossible = false;
            break;
        }
        if(isPossible) return true;
    }
        
    if(r <= n-5 && c >= 4) {
        isPossible = true;
        for(int i=1; i<=4; i++) {
            if(board[r+i][c-i] == 'o') continue;
            isPossible = false;
            break;
        }
        if(isPossible) return true;
    }
    return false;
}

 

 

결과 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        
        StringBuilder sb = new StringBuilder();
        outer : for (int tc = 1; tc <= T; tc++) {
            sb.append('#').append(tc).append(' ');
            int n = Integer.parseInt(br.readLine());
            char[][] board = new char[n][n];
            for(int i=0; i<n; i++) board[i] = br.readLine().toCharArray();
            for(int i=0; i<n; i++) {
                for(int j=0; j<n; j++) {
                    if(board[i][j] == 'o') {                        
                        if(isExist(board, n, i, j)) {
                            sb.append("YES").append('\n');
                            continue outer;
                        }
                    }
                }
            }
            
            sb.append("NO").append('\n');
        }
        
        br.close();
        System.out.print(sb);
    }
    
    private static boolean isExist(char[][] board, int n, int r, int c) {
        boolean isPossible = true; 
        
        if(r <= n-5) {
            for(int i=1; i<=4; i++) {
                if(board[r+i][c] == 'o') continue;
                isPossible = false;
                break;
            }
            if(isPossible) return true;
        }
        if(c <= n-5) {
            isPossible = true;
            for(int i=1; i<=4; i++) {
                if(board[r][c+i] == 'o') continue;
                isPossible = false;
                break;
            }
            if(isPossible) return true;
        }
        if(r <= n-5 && c <= n-5) {
            isPossible = true;
            for(int i=1; i<=4; i++) {
                if(board[r+i][c+i] == 'o') continue;
                isPossible = false;
                break;
            }
            if(isPossible) return true;
        }
        
        if(r <= n-5 && c >= 4) {
            isPossible = true;
            for(int i=1; i<=4; i++) {
                if(board[r+i][c-i] == 'o') continue;
                isPossible = false;
                break;
            }
            if(isPossible) return true;
        }
        return false;
    }
}

'알고리즘(백준 등) 공부' 카테고리의 다른 글

SWEA 11112. 셀로판지  (0) 2026.06.03
SWEA 11285. 다트 게임  (0) 2026.06.02
SWEA 11316. 주기 찾기  (0) 2026.06.01
SWEA 11387. 몬스터 사냥  (0) 2026.06.01
SWEA 11445. 무한 사전  (0) 2026.05.31