BOJ_G4_3190
๐ [G4_3190] ๋ฑ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main{
static int[][] board;
static ArrayList<Integer> list_num;
static ArrayList<String> list_str;
static Deque<Node> node;
static int dx, dy;
static int N, K, L;
static int res, cnt;
public static class Node {
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
// **** input start ****
N = Integer.parseInt(br.readLine());
K = Integer.parseInt(br.readLine());
// ์ ์ฒด ๋ณด๋
board = new int[N][N];
// ์ฌ๊ณผ ์์น ์ ์ฅ
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine(), " ");
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
// ์ฌ๊ณผ์์น 1๋ก ์ ์ฅ
board[y - 1][x - 1] = 1;
}
// ๋ฐฉํฅ๋ณํ ๋ฆฌ์คํธ
L = Integer.parseInt(br.readLine());
// ์ ์ ์ฅ
list_num = new ArrayList<>();
// ๋ฌธ์์ ์ฅ
list_str = new ArrayList<>();
for (int i = 0; i < L; i++) {
st = new StringTokenizer(br.readLine(), " ");
int num = Integer.parseInt(st.nextToken());
String str = st.nextToken();
list_num.add(num);
list_str.add(str);
}
// ์ฒ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
dx = 1;
dy = 0;
cnt = 0;
res = 0;
// deque ์์ฑ
node = new LinkedList<>();
// ์ฒซ ์ขํ ์ฝ์
node.add(new Node(0, 0));
// ์ฌ๊ท ์์
recursive(0, 0);
System.out.println(res);
}
static void recursive(int x, int y) {
// ์นด์ดํ
+ 1
cnt++;
// ์ขํ ์ด๋์ ํ๊ณ ๋ง์ง๋ง์ ๋ฐฉํฅ์ ๋ฐ๊พผ๋ค
// ๋ค์ ์ขํ
int nx = x + dx;
int ny = y + dy;
// ๋ง์ฝ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ์๊ธฐ ๋ชธ์ ๋ฟ์ผ ๊ฒฝ์ฐ ๋
if (nx < 0 || ny < 0 || nx > N - 1 || ny > N - 1) {
// ๊ฐ ์ ์ฅ
res = cnt;
return;
}
for(Node list : node) {
if(list.x == nx && list.y == ny) {
// ๊ฐ ์ ์ฅ
res = cnt;
return;
}
}
// ์ฌ๊ณผ ์๋์ง ์ฒดํฌ -> ์์ผ๋ฉด ๊ผฌ๋ฆฌ ์ญ์
if (board[ny][nx] == 0) {
node.removeLast();
}
// ์ฌ๊ณผ ๋จน๊ณ ์ญ์
if(board[ny][nx] == 1) {
board[ny][nx] = 0;
}
// ๋จธ๋ฆฌ ๋ค์์นธ ์ด๋ ( ๋งจ ์์ ์ฝ์
)
node.addFirst(new Node(nx, ny));
if (list_num.size() > 0) {
if (cnt == list_num.get(0)) {
change(list_str.get(0).charAt(0));
// ์ฌ์ฉํ ๊ฒ ์ญ์ ํด์ฃผ๊ธฐ
list_num.remove(0);
list_str.remove(0);
}
}
// ๋ฐ๋ณต
recursive(nx, ny);
}
// ๋ฐฉํฅ ์ ํ
static void change(char c) {
// ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๊พธ๊ธฐ
if (c == 'D') {
// ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๊ณ ์์ผ๋ฉด ์๋์ชฝ์ผ๋ก
if (dx == 1 && dy == 0) {
dx = 0;
dy = 1;
}
// ๋ฐ์ผ๋ก ๊ฐ๊ณ ์์ผ๋ฉด ์ผ์ชฝ์ผ๋ก
else if (dx == 0 && dy == 1) {
dx = -1;
dy = 0;
}
// ์ผ์ชฝ์ผ๋ก ๊ฐ๊ณ ์์ผ๋ฉด ์์ชฝ์ผ๋ก
else if (dx == -1 && dy == 0) {
dx = 0;
dy = -1;
}
// ์์ชฝ์ผ๋ก ๊ฐ๊ณ ์์ผ๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก
else if (dx == 0 && dy == -1) {
dx = 1;
dy = 0;
}
}
// ์ผ์ชฝ์ผ๋ก ๋ฐ๊พธ๊ธฐ
else if (c == 'L') {
// ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๊ณ ์์ผ๋ฉด ์์ชฝ์ผ๋ก
if (dx == 1 && dy == 0) {
dx = 0;
dy = -1;
}
// ์๋์ชฝ์ผ๋ก ๊ฐ๊ณ ์์ผ๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก
else if (dx == 0 && dy == 1) {
dx = 1;
dy = 0;
}
// ์ผ์ชฝ์ผ๋ก ๊ฐ๊ณ ์์ผ๋ฉด ์๋์ชฝ์ผ๋ก
else if (dx == -1 && dy == 0) {
dx = 0;
dy = 1;
}
// ์์ชฝ์ผ๋ก ๊ฐ๊ณ ์์ผ๋ฉด ์ผ์ชฝ์ผ๋ก
else if (dx == 0 && dy == -1) {
dx = -1;
dy = 0;
}
}
}
}
๐ค ๋์ ์๊ฐ
์ฌ๊ธฐ์ deque๋ฅผ ํ์ฉํ ์ด์ ๋ ์ฌ๊ณผ๊ฐ ์์ผ๋ฉด ํ๋์ node๋ง ์ถ๊ฐํ๋ฉด ๋์ง๋ง ์ฌ๊ณผ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ๋ง์ง๋ง node๋ฅผ ์ญ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ๋ค๋ก ๊ฐ๋จํ๊ฒ ์ฝ์
, ์ญ์ ํ ์ ์๋ deque๋ฅผ ํ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ Node ํด๋์ค๋ฅผ ํตํด์ ์ขํ๋ฅผ ๋ฐ์์จ๋ค.
- ๋ฐฉํฅ์ ์ ํ๊ณ ํ ์นธ์ฉ ์ด๋ํ๋ฉด deque์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ค.
- ์ฌ๊ณผ๊ฐ ์์ผ๋ฉด ๊ทธ๋๋ก ํ๋์ node๋ฅผ ์ถ๊ฐํ๋ค.
- ์ฌ๊ณผ๊ฐ ์์ผ๋ฉด ํ๋์ node๋ ์ถ๊ฐํ์ง๋ง deque์ ์ ์ฅ๋์ด์๋ ๋ง์ง๋ง node๋ ์ญ์ ํ๋ค.
- ์ด ๊ณผ์ ๋ค์ ๋ฐ๋ณตํ๋ฉฐ ๊ธฐ์กด deque์ ์๋ node๊ฐ์ ๋๋ฌํ๊ฑฐ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ๋ !
- ์ด ํ์๋ฅผ ์นด์ดํ ํด์ค๋ค.