1. ๋ฌธ์ ์ ๋ํ์ฌ ๐ฆ
- ๋ฌธ์ ๋งํฌ: https://www.acmicpc.net/problem/17837
(1) ์กฐ๊ฑด ๋ถ์ ๐
A. ๋ง์ ๋ํ ๊ท์น
- ๋ง์ ๊ฐ์ ๋์๊ฐ๋ ค๋ ๋ฐฉํฅ์ด ์๋ค.
- ํ๋์ ์นธ์ ์ฌ๋ฌ ๋ง์ด ์์ ์, ์ท๋์ด์ฒ๋ผ ๊ธฐ์กด์ ์๋ ๋ง์ด ์๋ก ํด๋น ์นธ์ ์จ ๋ง์ ์ ๋๋ค. (stack)
- ํ๋์ ๋ง์ด ์์ ์ ๋ฐฉํฅ์ผ๋ก ์์ง์ผ ๋ ์ ํ ๋ง๋ค๋ ๊ฐ์ด ์์ง์ธ๋ค. (์ด๋ ์์ ์ ๋์๊ฐ๋ ค๋ ๋ฐฉํฅ์ ๋ฐ๋์ง ์๋๋ค.)
- ๋ง๋ค์ ์์ ์ด ๋์๊ฐ ๋ค์ ์นธ์ ์๊น์ ๋ฐ๋ผ ํ๋์ด ๋ฏธ์ธํ๊ฒ ๋ฐ๋๋ค.
B. ๋ณด๋ ์นธ ๋ณ ๊ท์น
- ํฐ ์นธ์ ๋ฐ์ ๊ฒฝ์ฐ, ์ ์ ๋ง ์ ๋ถ ๊ฐ์ด ์์ง์ด๋ ๊ฑฐ ์ธ์ ํน์ด ์ฌํญ ์์
- ๋นจ๊ฐ ์นธ์ ๋ฐ์ ๊ฒฝ์ฐ, ์์ ์ ํฌํจํ ์
์ ๋ง๋ค์ ์์น๊ฐ ๊ฑฐ๊พธ๋ก ๋์ด์ผ ํ๋ค.
(exA->B->C (TOP) ์์ผ๋ก ์ ํ ์์๋ค๋ฉด, C -> B -> A(TOP) ์ผ๋ก ๋ฐ๋์ด์ผ ํจ.) - ํ๋ ์นธ์ ๋ฐ์ ๊ฒฝ์ฐ, ํด๋น ์นธ์ผ๋ก ๋์๊ฐ์ง ์๊ณ ๋ฐฉํฅ์ ๋ฐ๊พผ๋ค.
- ๋ฐฉํฅ์ ๋ฐ๊ฟ์ ํ ์นธ ๋์๊ฐ์ ๊ฒฝ์ฐ๋ ํ๋ ์นธ์ ๋ฐ๋๋ค๋ฉด ์์ง์ด์ง ์๊ณ ๋ค์ ๋ง ์ด๋์ผ๋ก ๋์ด๊ฐ๋ค.
- ๋ฐฉํฅ์ ๋ฐ๊ฟ์ ํ ์นธ์ ๊ฐ์ ์ ํ๋ ์นธ์ด ์๋๋ผ๋ฉด, ํด๋น ์นธ์ ์๊น ๊ท์น์ ๋ง๊ฒ ์์ง์ธ๋ค.
2. ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐ ๏ธ
KEY WORD: ์๋ฎฌ๋ ์ด์
์์ง๋ฐฐ๊ธฐ ๊ตฌํ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ํ๋ฉด ๋๋ค. ํด๋น ๋ฌธ์ ๊ฐ ์ด๋ ค์ด ์ ์ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ์ ์ฅํด์ผํ ์ ๋ณด๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ค์ํ๊ธฐ ์ฝ๋ค๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ ๋ช ์พํ๊ฒ ๊ตฌ๋ถํ๋๋ฐ๋ง ์ฑ๊ณตํ๋ค๋ฉด, ๊ตฌํ ์์ฒด๋ ์ด๋ ต์ง ์๋ค. ๋ค์์ ํ์๊ฐ ํ ๋ฐฉ์์ ๋ํ ์๊ฐ์ผ ๋ฟ์ด๊ณ , ๊ฐ์์ ๋ฐฉ๋ฒ์ ๋ง๊ฒ ํ๋ฉด ๋๊ฒ ๋ค.
(1) ๋ง์ ๋ํ ์ ๋ณด
static class Horse {
int r;
int c;
int dir;
public Horse (int r, int c, int dir){
this.r = r;
this.c = c;
this.dir = dir;
}
}
๋ง์ ํ ์์น์ ๋์๊ฐ๋ ค๋ ๋ฐฉํฅ์ ๋ฐ๋ก ์ ์ฅํด๋์๋ค.
static HashMap<Integer, Horse> horse = new HashMap<>();
๋ง์ ๋ฒํธ๋ ๊ทธ ๋ง์ ํน์ ํ ๋ ๊บผ๋ด์จ์ผ ํจ์ผ๋ก, HashMap์ Key๋ก ์ฌ์ฉํ๋ค.
(2) Board์ ์๊น ์ ์ฅ
static int [][] map; // 0 = ํฐ์, 1 = ๋นจ๊ฐ์, 2 = ํ๋์
2์ฐจ์ ๋ฐฐ์ด๋ก ์ ์ฅํ๋ค.
(3) Board๋ง๋ค ์กด์ฌํ๋ ๋ง์ ์ํ
static ArrayList<Integer> [][] stack; // index = 0 ์ด ๋งจ ์๋, ๊ทธ ์ดํ๋ก๋ถํฐ ์์์ฌ๋ผ๊ฐ.
์๊น๊ณผ ๋ถ๋ฆฌํด์ ํํํ๋ค. 2์ฐจ์ ๋ฐฐ์ด์ ์ขํ๋ง๋ค ArrayList<Integer> ๊ฐ ์กด์ฌํ๋๋ก ํ์ฌ, '๋ง์ด ์
ํ ์ํ'๋ฅผ ํํํ๋ค. ๋ฌธ์ ๋ฅผ ํ๊ณ ๋์ ๋ณต๊ธฐํด๋ณด๋, (2)๋ฒ๊ณผ (3)๋ฒ ๋ํ Board๋ผ๋ ํด๋์ค๋ก ๋ฌถ์ด์ ํํํ๋ ๊ฒ ๋ OOP์ ๋ง์์ ๊ฒ ๊ฐ๋ค.
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ โณ
1 turn์ ๋ชจ๋ ๋ง์ ์์ฐจ์ ์ผ๋ก 1ํ์ฉ ์์ง์ธ๋ค.
๋ฌธ์ ์์ turn์ด 1000๋ฒ์ ๋์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ผ๊ณ ํ์๊ณ , ๋ง๋ ์ต๋ 10๊ฐ๋ผ์, $10 \times 1,000 = 10,000$
์ด๋ฏ๋ก ์๊ฐ ์ด๊ณผ ๊ฑฑ์ ์ ํ์ ์์ ๋ฏ ํ๋ค.
3. ์ฝ๋ ๐
(1) SUDO CODE ๐ฌ
1. ๊ฐ ์ด๊ธฐํ
2. ํ์ ์นธ ๋ฐ์ ๋ ๊ตฌํ
3. ๋นจ๊ฐ ์นธ ๋ฐ์ ๋ ๊ตฌํ
4. ํ๋ ์นธ ๋ฐ์ ๋ ๊ตฌํ
5. 1000๋ฒ๊น์ง turn์ ์งํ
1. ํ์ฌ ์์ง์ธ ๋ง์ด ์๋ ์์น์ ๋ง์ด 4๊ฐ๊ฐ ๊ฐ์ด ์๋ ์ํ์ธ์ง ํ์ธ
2. ๋ง์ผ๋ฉด turn ์ ์ถ๋ ฅ ํ ํ๋ก๊ทธ๋จ ์ข
๋ฅ
3. ์๋๋ฉด ๋ค์ LOOP ๋๊ธฐ
(2) JAVA CODE โ
import java.io.*;
import java.util.*;
public class Main {
static class Horse {
int r;
int c;
int dir;
public Horse (int r, int c, int dir){
this.r = r;
this.c = c;
this.dir = dir;
}
} static HashMap<Integer, Horse> horse = new HashMap<>();
static ArrayList<Integer> [][] stack; // index = 0 ์ด ๋งจ ์๋, ๊ทธ ์ดํ๋ก๋ถํฐ ์์์ฌ๋ผ๊ฐ.
static int [][] map; // 0 = ํฐ์, 1 = ๋นจ๊ฐ์, 2 = ํ๋์
static int [][] dir = new int [][] {{-999, -999}, {0,1}, {0,-1}, {-1,0}, {1,0}};
static int N, K;
public static void main(String[] args) throws IOException {
init();
int cnt = 1;
while(cnt <= 1_000){
for(int i = 0; i < K; i++){
move(i);
Horse now = horse.get(i);
if(stack[now.r][now.c].size() >= 4) {
System.out.println(cnt);
return;
}
} cnt++;
}
System.out.println(-1);
}
// ์์ง์ด๋ ค๋ ๋ง์ ๋ค์ ์์น๊ฐ ํฐ์์ธ์ง, ๋นจ๊ฐ์์ธ์ง, ํ๋์ or ์ฅ์ธ์ธ์ง ํ์ธ ํ ์ ์ ํ ์์ง์์ผ๋ก ์ด๋
public static void move(int index) {
Horse now = horse.get(index);
int nextR = now.r + dir[now.dir][0];
int nextC = now.c + dir[now.dir][1];
if(OOB(nextR, nextC)) goBlue(now.r, now.c, index);
else switch (map[nextR][nextC]){
case 0: {
goWhite(now.r, now.c, index);
break;
}
case 1: {
goRed(now.r, now.c, index);
break;
}
default: goBlue(now.r, now.c, index);
}
}
public static void goWhite(int r, int c, int index) {
Horse origin = horse.get(index);
ArrayList<Integer> now = stack[r][c];
ArrayList<Integer> temp = new ArrayList<>();
int peek = now.size()-1;
// stack ์ ์์ ๊ฒ๋ค ๋จผ์ ์ขํ ์ฎ๊ธฐ๊ธฐ
while(now.get(peek) != index){
int idx = now.get(peek);
Horse h = horse.get(idx);
h.r += dir[origin.dir][0];
h.c += dir[origin.dir][1];
temp.add(idx);
now.remove(peek--);
}
// ๋ด๊ฐ ์์ง์ด๋ ค๋ ๋ง ์ขํ ์ฎ๊ธฐ๊ธฐ
origin.r += dir[origin.dir][0];
origin.c += dir[origin.dir][1];
temp.add(index);
now.remove(peek);
// stack์ ์๊ธฐ
for(int i = temp.size()-1; i >= 0; i--){
stack[origin.r][origin.c].add(temp.get(i));
}
}
public static void goRed(int r, int c, int index) {
Horse origin = horse.get(index);
origin.r += dir[origin.dir][0];
origin.c += dir[origin.dir][1];
ArrayList<Integer> now = stack[r][c];
int peek = now.size()-1;
// stack ์ ์์ ๊ฒ๋ค ๋จผ์ ์ขํ ์ฎ๊ธฐ๊ธฐ
while(now.get(peek) != index){
int idx = now.get(peek);
Horse h = horse.get(idx);
h.r += dir[origin.dir][0];
h.c += dir[origin.dir][1];
// stack์ ๋ฐ๋ก ๋ฃ์ด์ผ ๋ฐ๋๋ก ๋ค์ด๊ฐ.
stack[origin.r][origin.c].add(idx);
now.remove(peek--);
}
// ๋ด๊ฐ ์์ง์ด๋ ค๋ ๋ง ์ขํ ์ฎ๊ธฐ๊ธฐ
now.remove(peek);
stack[origin.r][origin.c].add(index);
}
public static void goBlue(int r, int c, int index) {
// ๋ฐฉํฅ ๋ฐ๊พธ๊ธฐ
Horse origin = horse.get(index);
origin.dir = (origin.dir == 1)? 2
: (origin.dir == 2)? 1
: (origin.dir == 3)? 4
: (origin.dir == 4)? 3 : 0;
// ๋ฐฉํฅ ๋ฐ๊ฟจ๋๋ฐ๋ ๋ค์ ํ ์นธ์ด blue๋ OOB์ธ์ง ํ์ธ
int nextR = origin.r + dir[origin.dir][0];
int nextC = origin.c + dir[origin.dir][1];
// ๋ง์ผ๋ฉด ๊ฐ๋งํ ์์๊ธฐ
if(OOB(nextR, nextC) || map[nextR][nextC] == 2) return;
// ์๋๋ฉด ์ด๋
if(map[nextR][nextC] == 0) goWhite(r, c, index);
if(map[nextR][nextC] == 1) goRed(r, c, index);
}
public static boolean OOB (int r, int c) {
return r < 0 || c < 0 || r >= N || c >= N;
}
public static void init() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
map = new int [N][N];
stack = new ArrayList[N][N];
for(int i = 0; i < N; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j < N; j++){
map[i][j] = Integer.parseInt(st.nextToken());
stack[i][j] = new ArrayList<>();
}
}
for(int i = 0; i < K; i++){
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken())-1;
int c = Integer.parseInt(st.nextToken())-1;
int dir = Integer.parseInt(st.nextToken());
horse.put(i, new Horse(r, c, dir));
stack[r][c].add(i);
}
}}
4. ํธ๋ฌ๋ธ ์ํ or ๋ฐฐ์ด ์ ๐
IDE ์ฐ๋๊น ๋ฐ๋ก ํ๋ฆฐ๋ค.
๋ฑํ ๋๋ฒ๊ฑฐ๋ฅผ ์ด ๊ฑด ์๋์ง๋ง, ArrayOutOfIndex๊ฐ ๋ ์์น๋ฅผ ์๋ ค์ค์ ์๋ฌ ํ์ธ์ด ์ฌ์์ ๊ทธ๋ฐ ๊ฒ์ธ๊ฑฐ ๊ฐ๋ค. ์ดํ์๋ ์ค์ ํ
์คํธ ํ๊ฒฝ์์ ํ์ด๋ด์ผ๊ฒ ๋ค.