SWEA 11315 오목 판정 (Java)

sua_ahn·2023년 1월 12일
0

알고리즘 문제풀이

목록 보기
4/14
post-thumbnail

4중첩 for문 & 2차원 배열 델타 사용

import java.util.Scanner;

class Solution {
	public static void main(String args[]) throws Exception {
		Scanner sc = new Scanner(System.in);
        int[] dr = {1, 1, 1};	// 델타
		int[] dc = {1, 0, -1};	// 우하 하 좌하
            
		int T = sc.nextInt();
		for(int test_case = 1; test_case <= T; test_case++) {
			int N = sc.nextInt();
            String ans = "NO";
            char[][] arr = new char[N][N];		// 오목판
            
            for(int i = 0; i < N; i++) {
                String tempStr = sc.next();		// 오목돌 입력받기
                arr[i] = tempStr.toCharArray();
                if(tempStr.contains("ooooo")) { // 행 검색
                    ans = "YES";
                }
            }
            
            if(ans.equals("NO")) {
                all:for(int i = 0; i < N - 4; i++) {		// 내 행의 위치
                    for(int j = 0; j < N; j++) {			// 내 열의 위치
                        for(int d = 0; d < 3; d++) {		// 탐색할 방향
                            
                            boolean bingo = true;
                            for(int k = 0; k < 5; k++) {	// 탐색
                                int nr = i + dr[d] * k;
                                int nc = j + dc[d] * k;
                                // 인덱스 범위
                                if(nr >= 0 && nr < N && nc >= 0 && nc < N) {
                                    if(arr[nr][nc] == '.') {
                                        bingo = false;
                                        break;
                                    }
                                    
                                } else {	// 인덱스 범위를 벗어나면 false
                                    bingo = false;
                                    break;
                                }
                            } // end for k
                            
                            if(bingo) {		// 조건을 모두 충족하면 YES
                                ans = "YES";
                                break all;
                            }
                        } // end for d
                    } //end for j
                } // end for i
            } // end if
            System.out.printf("#%s %s%n", test_case, ans);
		}
	}
}

 

함수 생성 방법

import java.util.Scanner;

public class Solution {
	// 델타 (좌하 하 우하 우)
	static int[][] drc = { { 1, -1 }, { 1, 0 }, { 1, 1 }, { 0, 1 } };

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
        
		int T = sc.nextInt();
		for(int test_case = 1; test_case <= T; test_case++) {
			int N = sc.nextInt();
			char[][] arr = new char[N][N];			// 오목판
			for (int i = 0; i < N; i++) {
				arr[i] = sc.next().toCharArray();	// 오목돌 입력받기
			}
            
			boolean flag = false;
			all: for (int r = 0; r < N; r++) {	// 내 행의 위치
				for (int c = 0; c < N; c++) {	// 내 열의 위치
                	// 탐색
					if (arr[r][c] == 'o') {		// 내 위치에 오목돌 있으면
						flag = check(arr, r, c, N);
						if (flag) {
							break all;
						}

					} // end if 'o' 
				} // end for c
			} // end for all
            
			if (flag) {
				System.out.println("#" + test_case + " " + "YES");
			} else {
				System.out.println("#" + test_case + " " + "NO");
			}
		} // end for : test_case
	}

	static boolean check(char[][] arr, int r, int c, int size) {
		for (int d = 0; d < 4; d++) {		// 탐색 방향
			for (int k = 1; k <= 4; k++) {	// 오목돌 4개 탐색
            
				int nr = r + drc[d][0] * k;
				int nc = c + drc[d][1] * k;
                // 인덱스 범위 & 오목돌 존재
				if (nr >= 0 && nr < size 
                	&& nc >= 0 && nc < size 
                    && arr[nr][nc] == 'o') {
					if (k == 4) {
						return true;
					}
				} else {
					break;
				}
			} // end for k
		} // end for d
		return false;
	}
}
profile
해보자구

0개의 댓글