Skip to content

Commit 8f26a67

Browse files
committed
뱀 / 골드 4 / 112ms
1 parent 24b4889 commit 8f26a67

File tree

1 file changed

+158
-0
lines changed

1 file changed

+158
-0
lines changed

src/N3190/N3190_seoyeon.java

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package N3190;
2+
3+
import java.io.BufferedReader;
4+
import java.io.BufferedWriter;
5+
import java.io.IOException;
6+
import java.io.InputStreamReader;
7+
import java.io.OutputStreamWriter;
8+
import java.util.ArrayDeque;
9+
import java.util.Deque;
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
import java.util.StringTokenizer;
13+
14+
public class N3190_seoyeon {
15+
// 배열 크기
16+
static int N;
17+
// 뱀의 이동과 사과가 있는 곳을 저장할 게임 지도 생성
18+
static int[][] game;
19+
// 사과 갯수, 뱀 방향
20+
static int K, L;
21+
// 뱀이 이동할 시간과 방향을 담아 놓을 맵
22+
static Map<Integer, String> move = new HashMap<>();
23+
// 시간을 측정할 변수
24+
static int time = 0;
25+
// 뱀 이동 방향 정의 상우하좌
26+
static int[] dr = {-1, 0, 1, 0};
27+
static int[] dc = {0, 1, 0, -1};
28+
// 뱀 이동 좌표 저장
29+
static Deque<int[]> queue = new ArrayDeque<>();
30+
31+
public static void main(String[] args) throws IOException {
32+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
33+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
34+
35+
N = Integer.parseInt(br.readLine());
36+
game = new int[N + 1][N + 1];
37+
38+
K = Integer.parseInt(br.readLine());
39+
40+
int k = K;
41+
while (k-- > 0) {
42+
StringTokenizer st = new StringTokenizer(br.readLine());
43+
int r = Integer.parseInt(st.nextToken());
44+
int c = Integer.parseInt(st.nextToken());
45+
// 사과 위치 기록
46+
game[r][c] = 1;
47+
}
48+
49+
L = Integer.parseInt(br.readLine());
50+
int l = L;
51+
while (l-- > 0) {
52+
StringTokenizer st = new StringTokenizer(br.readLine());
53+
int sec = Integer.parseInt(st.nextToken());
54+
String dir = st.nextToken();
55+
move.put(sec, dir);
56+
}
57+
// 뱀 몸을 추가
58+
queue.add(new int[] {1, 1});
59+
60+
// 뱀 초기 위치
61+
game[1][1] = 2;
62+
move();
63+
64+
bw.write(Integer.toString(time));
65+
bw.flush();
66+
bw.close();
67+
br.close();
68+
69+
}
70+
71+
// 뱀이 이동하는 메소드
72+
private static void move() {
73+
int snakeR = 1; // 현재 뱀의 r 좌표
74+
int snakeC = 1; // 현재 뱀의 c 좌표
75+
int snakeD = 1; // 현재 뱀의 방향 (오른쪽)
76+
77+
while (true) {
78+
// 시간 증가
79+
time++;
80+
81+
82+
int nr = snakeR + dr[snakeD];
83+
int nc = snakeC + dc[snakeD];
84+
85+
// 벽 부딪히면
86+
if (nr <= 0 || nr >= N + 1 || nc <= 0 || nc >= N + 1) {
87+
return;
88+
}
89+
90+
// 몸 충돌
91+
// game 배열에서 뱀이 위치하고 있는 곳 다음에 방문하게 되면 바로 return
92+
if (game[nr][nc] == 2) {
93+
return;
94+
}
95+
96+
// 사과가 있는 경우
97+
if (game[nr][nc] == 1) {
98+
// 사과 먹기
99+
game[nr][nc] = 0;
100+
}
101+
// 사과가 없는 경우
102+
else if (game[nr][nc] == 0) {
103+
// 꼬리 줄이기
104+
int[] removeTail = queue.removeFirst();
105+
game[removeTail[0]][removeTail[1]] = 0;
106+
}
107+
// 머리 이동
108+
queue.add(new int[] {nr, nc});
109+
game[nr][nc] = 2;
110+
snakeR = nr;
111+
snakeC = nc;
112+
113+
// 방향 전환
114+
if (move.containsKey(time)) {
115+
snakeD = moveDir(snakeD);
116+
}
117+
118+
119+
} // while
120+
121+
}
122+
123+
// 뱀의 방향을 바꾸는 함수
124+
// 상우하좌
125+
private static int moveDir(int dir) {
126+
String currD = move.get(time);
127+
// 왼쪽으로 90
128+
if (currD.equals("L")) {
129+
switch (dir) {
130+
case 0:
131+
return 3;
132+
case 1:
133+
return 0;
134+
case 2:
135+
return 1;
136+
case 3:
137+
return 2;
138+
}
139+
}
140+
// 오른쪽으로 90
141+
else {
142+
switch (dir) {
143+
case 0:
144+
return 1;
145+
case 1:
146+
return 2;
147+
case 2:
148+
return 3;
149+
case 3:
150+
return 0;
151+
}
152+
153+
}
154+
155+
return dir;
156+
}
157+
158+
}

0 commit comments

Comments
 (0)