1. ๋ฌธ์ ์ค๋ช ๐
(1) ๋งํฌ๐
https://www.acmicpc.net/problem/2615
(2) ํด์ค๐ต
์ฃผ์ํด์ผํ ์
- 1๏ธโฃ ๋ฐ๋์์ด ๊ฐ๋ก ์ธ๋ก ํน์ ๋๊ฐ์ ์ผ๋ก ๋์์ 6๊ฐ ์ด์ 9๊ฐ ์ดํ๋ก ๋๋๋ ๊ณณ๋ ์๋ค.
(์ด ๊ฒฝ์ฐ, ๋ฌธ์ ์ ์น๋ฆฌ ์กฐ๊ฑด์ธ '5๊ฐ๊ฐ ์ฐ์๋์ด์ ๋์์ก๋ค.' ๋ฅผ ์๋ฐฐํ๊ธฐ์ ๋ต์ด ์๋๋ค.) - 2๏ธโฃ ์ฌ๊ท๊ฐ ๋ฐ๋ํ์ ๋ฒ์ด๋๋ ์๊ฐ์ ๊ฐ์งํด์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํด์ผ ํ๋ค.
2. ์๊ฐ์ ํ๋ฆ: ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐๏ธ
(1) IDEA ๋์ถ๐ก
KEY WORD
: ์ฌ๊ท
, SIMULATION
ํด๋น ๋ฌธ์ ๋ ์ง์ง ์ค๋ชฉ์ ๋๋ฏ์ด, ํฐ์ ํน์ ๊ฒ์์ ๋ฐ๋์์ด ๋์จ ์์ ๋ถํฐ, ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ผ๋ก 5๊ฐ๊ฐ ์ฐ์
๋๋์ง ํ์ธํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ์ด๋ค.
โ ๊ตฌํด์ผํ ๋ฐฉ๋ฉด ์ ํ๊ธฐ
๊ทธ๋ผ 8๋ฐฉ๋ฉด
์ ๋ค ๊ตฌํด์ผ ํ ๊น? ์๋๋ค. ๊ทธ ์ ๋ฐ๋ง ๊ตฌํ๋ฉด ๋๋ค. ์ฐ๋ฆฌ๋ ์ผ์ชฝ ์๋จ[0,0]๋ถํฐ ์ค๋ฅธ์ชฝ ํ๋จ[18,18]๊น์ง ์ฐจ๋ ๋ก ๊ณ์ฐํ ๊ฒ์์ผ๋ก, (์ฐ์ธก ์๋จ ๋๊ฐ), (์ฐ์ธก ๊ฐ๋ก), (์ฐ์ธก ํ๋จ ๋๊ฐ), (ํ๋จ ์ธ๋ก) 4๊ฐ์ง๋ง ํ์ธํด์ฃผ๋ฉด ๋๋ค. ์๋ํ๋ฉด ์ด๋ ๊ฒ ๊ณ์ฐํ๋ค๋ฉด, ์ด์ ์ ๊ณ์ฐํ๋ ํด๋น 4๋ฐฉ๋ฉด์ด ์ด๋ค ์์ ์ ๋ฐ๋์์๊ฒ (์ข์ธก ํ๋จ ๋๊ฐ), (์ข์ธก ๊ฐ๋ก), (์ข์ธก ์๋จ ๋๊ฐ), (์๋จ ์ธ๋ก)๊ฐ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
โ ๋ฐ๋์์ ํ์ธํ๋ฉฐ ์ฃผ์ํ ์
ํด๋น ๋ฌธ์ ๋ ๊ตฌํ์ด ์์ฒญ ์ด๋ ต๋ค๊ธฐ ๋ณด๋จ, ์๊ฐํด์ผํ ํ ์คํธ ์ผ์ด์ค๊ฐ ๋ง์์ ๊น๋ค๋กญ๋ค.
- 1๏ธโฃ 5๊ฐ์ ๋ฐ๋์์ ํ์ธํ ๋, ํ์ฌ ๋ณด๊ณ ์๋ ์ขํ๊ฐ ๋ฐ๋ํ์ ๋ฒ์ด๋๋์ง ํ์ธ (OOB Error ๋ฐฉ์ง)
- 2๏ธโฃ 6๋ฒ์งธ ๋ฐ๋์๋ ์ฐ์๋๋์ง ํ์ธ (์ด๊ฑด ์ด๊ธฐ๋ ์กฐ๊ฑด์ด ์๋๊ธฐ์ ๋์ด๊ฐ์ผํจ)
- 3๏ธโฃ ์ ์ผ ์ฒซ ๋ฒ์งธ๋ก ๋ณด๋ ๋ฐ๋์ด ํ์ฌ ํ์ธํ๋ ค๋ ์ง์ , ๋๊ฐ์ ์ ์ฐ์ ๋์ค์ ์๋ ๋ฐ๋์ธ์ง ํ์ธ
(์๋ฅผ ๋ค์ด, (5,0),(4,1), (3,2), (2,3),(1,4),(0,5)๋ 6๊ฐ๊ฐ ์ฐ์ํ๋ ์ ์ด๋ผ์ ์๋๋ ๊ฒฝ์ฐ์ด๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ข ์๋จ๋ถํฐ ํ์ธํ๋ค ๋ณด๋ **(4,1)์ ๋จผ์ ๋ง๋๊ฒ ๋๊ณ , 5๊ฐ๊ฐ ์ฐ์๋๋ค๊ณ ๋ต์ ๋ด๋๊ฒ ๋๋ค.** ๋ฐ๋ผ์ ์ด๋ฅผ ๋ฐฉ์งํด์ผ ํ๋ค.)
- 4๏ธโฃ 2๋ฒ์ ๊ฒฝ์ฐ์ฒ๋ผ ๋ฐ๋์์ด 6๊ฐ ์ด์ ์ฐ์๋๋ ๊ฒฝ์ฐ๋ ํด๋น ๋ฐ๋์์ ๊ทธ๋๋ก ๋๋ ๊ฒฝ์ฐ, 3๋ฒ ์ฒ๋ผ ๋ค์ ๊ณ์ฐ์ ํผ์ ์ ์ฃผ๋ฏ๋ก ์ ๋ถ ์ ๊ฑฐํ๋ค.
(2) SUDO CODE ๐
- 0๏ธโฃ ๋ฐ๋์ ๋ฐ๊ธฐ
- 1๏ธโฃ ๊ฒ์์ ํน์ ํฐ ์์ ๋ง๋๋ฉด (์ฐ์ธก ์๋จ ๋๊ฐ), (์ฐ์ธก ๊ฐ๋ก), (์ฐ์ธก ํ๋จ ๋๊ฐ), (ํ๋จ ์ธ๋ก)์ ๊ฐ๊ฐ ํ์ธํ๊ธฐ (์ฌ๊ท)
- 2๏ธโฃ ํ์ฌ ํ์ธํ๋ ค๋ ์ขํ๊ฐ ๋ฐ๋ํ์ ๋ฒ์ด๋๋์ง ํ์ธ
- 3๏ธโฃ ํ์ฌ ํ์ธํ๋ ค๋ ์ฐ์์ด 6๊ฐ ์ด์์ธ์ง ํ์ธ (6๊ฐ ์ด์์ด๋ฉด ํด๋น ์ฐ์๋ ๋ฐ๋์ ์ง์ฐ๊ธฐ)
- 4๏ธโฃ ํ์ฌ ํ์ธํ๋ ค๋ ์ฐ์์ ์ฒซ ๋ฒ์งธ ๋ฐ๋์์ด ๋ค๋ฅธ ์ฐ์์ ๋์ค ๊ฐ์ธ์ง ํ์ธ (์ด๊ฑด ์ฐ์ธก ์๋จ ๋๊ฐ์ ํ์ธํ ๋๋ง ํ์ธํ๋ฉด ๋๋ค. ์๋ํ๋ฉด, ์ฐ๋ฆฌ๋ ์ข์๋จ ๋ถํฐ ๊ฐ๋ค์ ํ์ธํ๊ธฐ ๋๋ฌธ์ ๋๋จธ์ง 3๊ฐ์ง ๊ฒฝ์ฐ, ์ฐ์์ ๋์ค ๊ฐ๋ณด๋ค ์ฐ์์ ์์์ ์ ๋จผ์ ๋ง๋๊ธฐ ๋๋ฌธ์ด๋ค.)
(3) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
$O(19^{2}*4*5)$
19*19 ๋ฐ๋ํ์์ ํ๋์ ๋ฐ๋์ ๋น (์ฐ์๋๊ฐ, ๊ฐ๋ก, ์ธ๋ก, ์ฐํ๋๊ฐ)์ ์ต๋ 5๋ฒ์ฉ ํ์ธํด์ผํจ.
3. ๊ตฌํ ์ฝ๋ ๐
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int [][][] boards = new int [5][19][19]; // 0 - ์๋ณธ, 1 - ๊ฐ๋ก, 2 - ์ธ๋ก, 3 - ์ฐ๋ฐ ๋๊ฐ, 4 - ์ฐ์ ๋๊ฐ
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 19; i++) {
StringTokenizer st= new StringTokenizer(br.readLine());
for (int j = 0; j < 19; j++) {
boards[0][i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 19; j++) {
System.arraycopy(boards[0][j],0, boards[i][j], 0, 19);
}
}
int ans = 0;
int ans_x = 0; int ans_y = 0;
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
if(boards[0][i][j] == 1 || boards[0][i][j] == 2){
int stone_num = boards[0][i][j];
if(horizontal(i,j,0,stone_num) || vertical(i,j,0,stone_num)
|| diagonal_row(i,j,0,stone_num) || diagonal_high(i,j,0,stone_num)){
ans = stone_num; ans_x = i+1; ans_y = j+1;
}
}
}
}
System.out.println(ans + (ans != 0? ("\n"+ans_x+" "+ans_y) : ""));
}
public static boolean horizontal(int x, int y, int depth, int stone_num){
if(depth == 5){
if(OOB(x,y)) return true;
else if(boards[1][x][y] != stone_num) return true;
else Arrays.fill(boards[1][x], -1);
return false;
}
if(OOB(x,y)) return false;
else if(boards[1][x][y] == stone_num) return horizontal(x,y+1, depth+1, stone_num);
else return false;
}
//---------------------------------------------------------------------------------------
public static boolean vertical(int x, int y, int depth, int stone_num){
if(depth == 5){
if(OOB(x,y)) return true;
else if(boards[2][x][y] != stone_num) return true;
else for (int i = 0; i < 19; i++) boards[2][i][y] = -1;
return false;
}
if(OOB(x,y)) return false;
else if(boards[2][x][y] == stone_num) return vertical(x+1,y, depth+1, stone_num);
else return false;
}
// ---------------------------------------------------------------------------------
public static boolean diagonal_row(int x, int y, int depth, int stone_num){
if(depth == 5){
if(OOB(x,y)) return true;
else if(boards[3][x][y] != stone_num) return true;
else {
for (int i = 0; i < 6; i++) boards[3][x-i][y-i] = -1;
return false;
}
}
if(OOB(x,y)) return false;
else if(boards[3][x][y] == stone_num) return diagonal_row(x+1,y+1, depth+1, stone_num);
else return false;
}
// ---------------------------------------------------------------------------------
public static boolean diagonal_high(int x, int y, int depth, int stone_num){
if(depth == 0 && !OOB(x+1, y-1) && boards[4][x+1][y-1] == stone_num) return false;
if(depth == 5){
if(OOB(x,y)) return true;
else if(boards[4][x][y] != stone_num) return true;
else {
for (int i = 0; i < 6; i++) boards[4][x+i][y-i] = -1;
return false;
}
}
if(OOB(x,y)) return false;
else if(boards[4][x][y] == stone_num) return diagonal_high(x-1,y+1, depth+1, stone_num);
else return false;
}
public static boolean OOB (int x, int y){
return (x < 0 || y < 0 || x > 18 || y > 18);
}
/*
* ๋ฒ์ ๋ฒ์ด๋๋์ง ํ์ธ
* ๊ธฐ์ ์กฐ๊ฑด
* 1. depth = 5๋ฒ์งธ ๋ฐ๋์์ด ์กด์ฌํ๊ณ ๊ทธ ๋ฐ๋์ ๋ฒํธ๊ฐ ํ์ฌ๋ ๊ฐ๋ค. false ๋ฐํ
* 1์์ ์ฌ์ฉ๋ ๋ฐ๋ ๋ชจ๋ -1๋ก ๋ฐ๊พธ์ด ์ฌ์ฉ ํ์ ๋จ๊ธฐ๊ธฐ
* 2. depth = 5๋ฒ์งธ ๋ฐ๋์์ด ์กด์ฌํ์ง ์๋๋ค. true ๋ฐํ
* ๊ณ์ฐ
* 1. ํ์นธ์ฉ ์ ์งํค๊ธฐ๋จ ๋น๋์ผ ๊ฐ์์ง ํ์ธ
* */
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
ํด๋น ๋ฌธ์ ๋ SSAFY ์ฒซ ๋ฒ์งธ ์ํ์์ ๋์จ ๊ฒ ๊ฐ์๋ฐ, ๊ฑฐ์ง 1๋ ๋ฐ๋ง์ ๋ค์ ํ์ด์ ๋ง์ท๋ค... ์ฐธ ์ธ์์ด ๋ฌด์ํ๊ณ , ํ๋ฃจํ๋ฃจ ์ ๊ทน์ ์ผ๋ก ์ด์์ผ๊ฒ ๋ค๋ ๊ฐํ๊ฐ ๊ต์ฐจํ๋ค.
์ฝ๋์ ๋ํด์๋ ๋ฐฉํฅ ๋ฐฐ์ด
์ ์ฐ๋ฉด 4๊ฐ์ ํจ์๋ฅผ ํ๋๋ก ์ค์ฌ ๋ ๊น๋ํ๊ฒ ํ ์ ์์ ๋ฏ ์ถ๋ค. ๋ํ ๊ตณ์ด ์ฌ๊ท๋ฅผ ์ฐ๊ธฐ ๋ณด๋จ 5๊ฐ ๋ฐ์ ์๋๊ณ , ๋ฐฉํฅ๋ ๋์ค์ ๋ฐ๋์ง ์์ผ๋ฏ๋ก, ๋ฐ๋ณต๋ฌธ์ ์จ๋ ๋ ๊น๋ํ์ ๊ฒ ๊ฐ๋ค. ๋ค์์ ํ๊ฒ ๋๋ฉด, ํ ๋ฒ ๊ทธ๋ ๊ฒ ๋ฐ๊ฟ๋ด์ผ ๊ฒ ๋ค.