본문 바로가기
CODING/BAEKJOON

[BAEKJOON] 2615번 오목

by snow_white 2022. 1. 25.

※ 문제를 해결하기 전 상황, 의문이 생겼다.

예제 입력은 19*19 개의 데이터를 받는다.

19번의 반복으로 입력을 한 줄씩 읽어 들여 공백을 기준으로 나누고, 일차원 배열로 만들어야겠다고 생각했다.

아래 코드를 보면 모든 입력 데이터(데이터 19*19개)를 담는 이차원 배열 arr[][],

한 줄씩(데이터 19개) 입력 받아 split() 함수로 나누어 데이터들을 담는 일차원 배열 str[]을 생성했다.

한 줄씩 입력 받아 일차원 배열에 저장하고, 저장된 일차원 배열을 이차원 배열의 각 행에 넣어준다면 모든 데이터가 순서대로 저장될 것이라 생각했다.

// 문제 있는 코드, 어느 부분이 문제인지 찾아볼 것!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BaekJoon2615 {

	public static void main(String[] args) throws IOException{
		String arr[][] = new String[19][19];
		String str[] = new String[19];
		for(int i=0; i<19; i++) {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
			str = br.readLine().split(" ");
			arr[i] = str;
			System.out.println("i : "+i+", Arrays: "+Arrays.toString(arr[i]));
		}
    }
}

하지만 예제 입력에 따른 결과는 다음과 같았다.

예제 입력 19*19 개를 (ctrl+c, ctrl+v) 하여 한 번에 입력했다.

// 한 번에 넣은 예제 입력
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 0
0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 0, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

i : 1, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

i : 2, Arrays: []

i : 3, Arrays: []

i : 4, Arrays: []

i : 5, Arrays: []

i : 6, Arrays: []

i : 7, Arrays: []

i : 8, Arrays: []

i : 9, Arrays: []

i : 10, Arrays: []

i : 11, Arrays: []

i : 12, Arrays: []

i : 13, Arrays: []

i : 14, Arrays: []

i : 15, Arrays: []

i : 16, Arrays: []

i : 17, Arrays: []

i : 18, Arrays: []

이차원 배열의 0번째 인덱스 즉, 첫 번째 행에는 일차원 배열이 정확히 저장된 것을 볼 수 있었다.

하지만 1번째 인덱스 즉, 두 번째 행부터 일차원 배열의 데이터가 저장되지 않는 것이다.

데이터를 한 줄씩 읽어들이지 못 하는 걸까..?

그렇다면,

예제 입력(19*19개 데이터)을 한 번에 넣지 말고 한 줄(19개 데이터)씩 넣어보자.

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
i : 0, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
i : 1, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
0 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 0
i : 2, Arrays: [0, 1, 2, 0, 0, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
i : 3, Arrays: [0, 0, 1, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 4, Arrays: [0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0
i : 5, Arrays: [0, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 6, Arrays: [0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0
i : 7, Arrays: [0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 8, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 9, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 10, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 11, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 12, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 13, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 14, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 15, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 16, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 17, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
i : 18, Arrays: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

너무나도 완벽하게 각각의 일차원 배열이 이차원 배열에 저장되었다.

한 번에 입력받기, 한 줄씩 입력받기의 차이가 무엇일지 생각했다.

 

아주 기초적인 부분에서 실수를 발견했다.

 

br.readLine(); 은 한 줄(개행까지)만 읽기 때문에 당연히 한 줄 입력을 받고 데이터를 더 이상 읽지 못 한다.

나의 코드에서는 반복문을 돌면서 BufferedReader 객체를 새로이 만들어내고 있다.

그러니 입력을 한 번에 넣으면 첫 번째 반복문 실행에서는 첫 줄은 읽어낼 수 있었겠지만,

다음 반복문을 실행할 때는 BufferedReader 객체가 새로 만들어기 때문에 애초에 아무런 입력이 들어가지 않아 데이터가 존재하지 않았던 것이었다.

BufferedReader 객체는 반복문 바깥으로 빼내어 한 번만 생성해야 한다.

그리고 br.readLine();으로 입력 받은 문장을 한 줄씩 읽어나가야 한다.

 


문제 풀이 힌트

1. 오목 (같은 색 돌 연속 5개) 탐색 방향 고려하기

2. 육목 (같은 색 돌 연속 6개) 고려하기

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

public class Main {
	static String arr[][] = new String[19][19];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String str[] = new String[19];

		int win = 0; // 이길 경우 갱신
		int x = 0, y = 0;
		boolean exit = false;

		for (int i = 0; i < 19; i++) {
			str = br.readLine().split(" ");
			arr[i] = str;
		}

		for (int i = 0; i < 19 && !exit; i++) {
			for (int j = 0; j < 19; j++) {
				if (arr[i][j].equals("1") || arr[i][j].equals("2")) {
					exit = check(i, j);
					if (exit) {
						win = Integer.parseInt(arr[i][j]);
						x = i;
						y = j;
						break;
					}
				}
			}
		}
		System.out.println(win);
		if (win != 0)
			System.out.println((x + 1) + " " + (y + 1));
	}

	public static boolean check(int x, int y) {
		int cnt = 1; // 카운트 변수
		boolean exit = false;

		if (!exit) {
			// 대각선 위 탐색
			int j = y + 1;
			for (int i = x - 1; i >= 0 && j <= 18; i--) {
				if (arr[i][j].equals(arr[x][y])) {
					cnt++;
				} else
					break;
				j++;
			}
			if(18>x && y>0 && (arr[x+1][y-1].equals(arr[x][y])))	// 육목 확인
				cnt = 6;
			if (cnt == 5)
				exit = true;
		}
		cnt = 1; // 카운트 변수
		if (!exit) {
			// 오른쪽 탐색
			int i = x, j = y + 1;
			for (; j <= 18; j++) {
				if (arr[i][j].equals(arr[x][y])) {
					cnt++;
				} else
					break;
			}
			if(0<y && arr[x][y-1].equals(arr[x][y]))	// 육목 확인
				cnt = 6;
			if (cnt == 5)
				exit = true;
		}
		cnt = 1; // 카운트 변수
		if (!exit) {
			// 아래쪽 탐색
			int i = x + 1, j = y;
			for (; i <= 18; i++) {
				if (arr[i][j].equals(arr[x][y])) {
					cnt++;
				} else
					break;
			}
			if(0<x && arr[x-1][y].equals(arr[x][y]))	// 육목 확인
				cnt = 6;
			if (cnt == 5)
				exit = true;
		}
		cnt = 1; // 카운트 변수
		if (!exit) {
			// 대각선 아래 탐색
			int i = x + 1, j = y + 1;
			for (; i <= 18 && j <= 18; i++) {
				if (arr[i][j].equals(arr[x][y])) {
					cnt++;
				} else
					break;
				j++;
			}
			if(x>0 && y>0 && arr[x-1][y-1].equals(arr[x][y]))	// 육목 확인
				cnt = 6;
			if (cnt == 5)
				exit = true;
		}
		return exit;
	}
}

[출처]

https://www.acmicpc.net/problem/2615

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

 

댓글