1:16
import java.io.*;
import java.util.*;
public class Main{
// ➡⬇⬆⬅ : 0,1,2,3
public static int[][] moves = new int[][]{{0,1},{1,0},{-1,0},{0,-1}};
// moves[0][0]는 현재 ➡방향일 때, C가 'D'인 경우, y는 curmoves[moves[0][0]][0]만큼 이동, x는 curmoves[moves[0][0]][1]만큼 이동
public static int[][] dirs = new int[][]{ {1,2},{3,0},{0,3},{2,1} };
// 현재 방향
public static int curDir=0; // 시작 : ➡방향
// board의 상태 : 2 -> 사과, 1 -> 뱀이 걸쳐져있는 칸임을 나타냄
public static int[][] board;
// 방향 전환정보 : FIFO : 몇초후, 무슨방향(0:D, 1: L )
public static Queue<int[]> q = new LinkedList<>();
// 뱀의 정보
public static Queue<int[]> snake = new LinkedList<>();
// 보드의 크기 n , 사과의 개수 k
public static int N;
public static int k;
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static StringTokenizer st;
public static void setting() throws IOException {
N = Integer.parseInt(br.readLine());
k = Integer.parseInt(br.readLine());
// ================ board init ==============
board = new int[N][N];
// 가장 좌측 , 맨 위 -> 뱀의 시작점
board[0][0]=1;
// 사과 정보 받기
int r=0,c=0;
for(int i=0;i<k;i++){
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken())-1;
c = Integer.parseInt(st.nextToken())-1;
board[r][c]=2;
}
// 방향 정보 받기
int l=0,s=0,dir=0;
String temp;
l = Integer.parseInt(br.readLine());
for(int i=0;i<l;i++){
st = new StringTokenizer(br.readLine());
s = Integer.parseInt(st.nextToken());
temp = st.nextToken();
if(temp.equals("D"))dir =0;
else dir =1;
q.add(new int[]{s,dir});
}
snake.add(new int[]{0,0});
}
public static int solve(){
int r=0,c=0;
int s=0;
int[] del =null,temp = null;
// curDir을 이용하여 이동한다 : 매 번 q의 가장 앞에 있는 원소의 시간과 비교한다.
while(true){
s++;
// curDir
r+=moves[curDir][0];
c+=moves[curDir][1];
// 벽이거나 뱀의 몸과 같은 곳 -> end
if(r<0 ||c<0||r>=N||c>=N||board[r][c]==1) break;
// 뱀의 위치 정보를 put
snake.add(new int[]{r,c});
// 사과가 있다면 몸을 늘린다
// 사과가 없다면 수축
if(board[r][c]!=2){
del = snake.poll(); // 뱀의 정보에서 delete
board[del[0]][del[1]]=0; // board에서 빈 칸으로 update
}
board[r][c]=1;
// s초가 끝난 뒤 , q의 값과 비교한다.
if(q.isEmpty()==false&&q.peek()[0]==s){
// q의 값과 같은 경우 -> 방향을 전환한다
temp = q.poll();
// temp[1]
// dirs[curDir][temp[1]]
curDir = dirs[curDir][temp[1]];
}
}
return s;
}
public static void main(String[] args)throws IOException {
setting();
int sec = solve();
System.out.println(sec);
}
}