※ 문제를 해결하기 전 상황, 의문이 생겼다.
예제 입력은 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
'CODING > BAEKJOON' 카테고리의 다른 글
[BAEKJOON] 4673 셀프 넘버 (0) | 2022.01.26 |
---|---|
[BAEKJOON] 1145번 적어도 대부분의 배수 (0) | 2022.01.26 |
[BAEKJOON] 1110번 더하기 사이클 (0) | 2022.01.24 |
[BAEKJOON] 4344번 평균은 넘겠지 (0) | 2022.01.24 |
[BAEKJOON] 2167번 2차원 배열의 합 (0) | 2022.01.24 |
댓글