[백준] 2615번: 오목 - Java

Cherry·2023년 11월 2일
1

💬 문제 파악하기

문제 출처

오목에서 이긴 사람을 찾고, 이긴 결과의 시작점이 되는 바둑의 위치를 찾는 문제입니다!
왼쪽 위부터 내려오면서 탐색을 한다고 하면 "오른쪽, 아래, 오른쪽 위 대각선, 오른쪽 아래 대각선" 이렇게 4가지 방향으로 검사를 할 수 있습니다.
4가지 방향으로 검사를 해서 5개가 완성되는 것을 찾으면 끝!

⭐️ 풀이

import java.io.*;
import java.util.*;

public class Main {
	// 배열을 사용하면 인덱스 시작이 0이므로 1부터 시작하기 위해 맨앞과 맨뒤에 하나씩 공간 추가
    static int[][] map = new int[21][21];
	static int[][][] memo = new int[21][21][4];
    
	static int[] dx = { 1, 1, 0, -1 };
	static int[] dy = { 0, 1, 1, 1 };
    
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        for(int i=1; i<=19; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=1; j<=19; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

		System.out.println(findFive());
	}

	private static String findFive() {
		for (int j = 1; j <= 19; j++) {
			for (int i = 1; i <= 19; i++) {
				if (map[i][j] != 0) {
					for (int d = 0; d < 4; d++) {
						if (memo[i][j][d] == 0 && calc(i, j, d, map[i][j]) == 5) {
							return map[i][j] + "\n" + i + " " + j + "\n";
						}
					}
				}
			}
		}
		return "0";
	}

	private static int calc(int x, int y, int dir, int color) {
		int nx = x + dx[dir];
		int ny = y + dy[dir];

		if (map[nx][ny] == color) {
			return memo[nx][ny][dir] = calc(nx, ny, dir, color) + 1;
		}
		return 1;
	}
}

profile
호기심 많은 백엔드 개발자입니다 😝

0개의 댓글