Algorithm

백준_오목_2615

Young_J 2021. 1. 4. 22:49

// 알고리즘

1. 구현

 

2. 탐색 배열 사용

 -> 원래 8방 탐색을 해야하지만 왼쪽 위부터 검사한다면 4방 탐색으로도 가능

 -> 우상, 우, 우하, 하 

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 오목_2615_re {
	static int[] dr = { -1, 0, 1, 1 };
	static int[] dc = { 1, 1, 1, 0 };
	static int[][] map;

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		map = new int[20][20];

		for (int i = 1; i <= 19; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			for (int j = 1; j <= 19; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		boolean flag = false;

		for (int r = 1; r <= 19; r++) {
			for (int c = 1; c <= 19; c++) {
				if (map[r][c] == 0)
					continue;
				for (int k = 0; k < 4; k++) {
					int num = 1;
					int cnt = 1;
					while (true) {
						int nr = r + dr[k] * cnt;
						int nc = c + dc[k] * cnt;

						if (check(nr, nc))
							break;
						if (map[nr][nc] != map[r][c])
							break;
						num++;
						cnt++;
					}
					if (num == 5) {
						int nr = r + dr[k] * -1;
						int nc = c + dc[k] * -1;

						if (check(nr, nc)) {
							System.out.println(map[r][c]);
							System.out.printf("%d %d\n", r, c);
							flag = true;
						} else {
							if (map[nr][nc] != map[r][c]) {
								System.out.println(map[r][c]);
								System.out.printf("%d %d\n", r, c);
								flag = true;
							}
						}

					}

				}

			}

		}

		if (!flag) {
			System.out.println(0);
		}

	}

	private static boolean check(int nr, int nc) {
		if (nr < 0 || nc < 0 || nr >= 20 || nc >= 20)
			return true;
		return false;
	}
}

 

※ 옛날에 400줄을 넘게 코딩해서 통과했던 코드인데 다시 풀어서 짧게 코딩함.

해당방향으로 최대한내려가서 5일때 왔던 방향의 반대로 다시 가는 코드가 있어야 하는데 안해서 여러번 틀림... 

쉬운 구현문제도 자주 풀어봐야할듯