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 |