https://www.acmicpc.net/problem/3190
1. ๋ฌธ์
NxN ํฌ๊ธฐ์ ๋งต ์์์ ๋ฑ์ด ์ด๋ํ๋ค.
์ฒ์์ ๋ฑ์ ๊ธธ์ด๋ 1, ์ขํ๋ 1, 1, ๋ฐฉํฅ์ ์ค๋ฅธ์ชฝ์ ํฅํ๋ค.
๋ฑ์ ๋งค ์ด๋ง๋ค ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฅธ๋ค.
1. ๋จธ๋ฆฌ๋ฅผ ๋ค์์นธ์ ์์น์ํจ๋ค.
2. ์์น๊ฐ ๋ฒฝ์ด๊ฑฐ๋ ๋ชธ์ผ ๊ฒฝ์ฐ ์ข ๋ฃ๋๋ค.
3. ๋จธ๋ฆฌ๊ฐ ์์นํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด ๊ผฌ๋ฆฌ๋ ์์ง์ด์ง ์๊ณ ,
์ฌ๊ณผ๊ฐ ์๋ค๋ฉด ๊ผฌ๋ฆฌ๊ฐ ์๋ ์นธ์ ๋น์์ค๋ค. ์ฆ, ๋ชธ ๊ธธ์ด๋ ๋ณํ์ง ์๋๋ค.
๊ฒ์์ด ๋ช ์ด๋ง์ ๋๋๋์ง๋ฅผ ์ถ๋ ฅํ๋ผ.
2. ํ์ด
๊ณจ๋4
์๋ฎฌ๋ ์ด์ ๋ฌธ์ ์ด๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ข์ํ๋ ์๋ฃ๊ตฌ์กฐ์ธ ํ๋ฅผ 2๊ฐ ์ฌ์ฉํ์๋ค.
๋ชธ์ ์ขํ๋ฅผ ์ ์ฅํ bodyQ, ๋ณํํ ์๊ฐ๊ณผ ๋ฐฉํฅ์ ์ ์ฅํ dirQ๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐฉํฅ ์ ํ์ dy, dx๋ฅผ ์ฌ์ฉํ์๋ค.
๊ทธ๋ฆฌ๊ณ map ๊ฐ์ด ๋น ์นธ์ผ ๋, ์ฌ๊ณผ ์ผ ๋, ๋ชธ์ผ ๋๋ฅผ ๊ตฌ๋ถํ ๋ ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํด static final๋ก ์ ์ธํ์ฌ ์ฌ์ฉํ์๋ค.
y, x ๋ ๋ค ์์์ 1, ๋ฐฉํฅ์ 0์ผ๋ก ์์ํ์๋ค.
map์ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ , bodyQ์ ์์์ง์ ์ขํ๋ฅผ ๋ฃ์ด์ค ํ ์ถ๋ฐํ๋ค.
1. ์ด๋
while๋ฌธ์ด ๋ ๋๋ง๋ค sec๋ 1์ฉ ๋์ด๋๋ค.
1) ๋จผ์ ์ด๋ํ ์ขํ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์งํํ๋ค.
- ๋ฒฝ์ด๋ฉด ์ข ๋ฃ (๋ฒ์๋ฅผ ๋์ด๊ฐ ๊ฒฝ์ฐ)
- ๋ชธ์ด ์์ผ๋ฉด ์ข ๋ฃ
2) ๊ผฌ๋ฆฌ ์ญ์ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
- ์ฌ๊ณผ๊ฐ ์์ผ๋ฉด ๊ทธ๋๋ก ๋๋ค.
- ๋น ์นธ์ด๋ฉด ๊ผฌ๋ฆฌ๋ฅผ ์ญ์ ํ๋ค.
์ด๋ํ ๋๋ง๋ค ์ ๊ฒฝ์จ์ผ ํ๋ ๊ฒ์
bodyQ์ map ๊ฐ์ด๋ค.
2. ๋ฐฉํฅ ์ค์
์ด๋์ด ๋๋๋ฉด setDir()๋ฅผ ํธ์ถํ์ฌ ๋ฐฉํฅ์ ์ค์ ํด์ค๋ค.
ํ์ฌ ์๊ฐ์ ์ธก์ ํ๊ณ dirQ์ ์๊ฐ๊ณผ ์ผ์นํ ๊ฒฝ์ฐ (์ค๋ฆ์ฐจ์ ์ ๋ ฅ์ด ๋ณด์ฅ๋จ)
dirQ์ ๋ฐฉํฅ์ ๋ง๊ฒ ํ์ฌ ๋ฐฉํฅ์ด ๊ฐฑ์ ๋๋ค.
D์ผ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์ผ๋ก 90๋, L์ผ ๊ฒฝ์ฐ ์ผ์ชฝ์ผ๋ก 90๋์ด๋ค.
์ด๋, ๋ฐฉํฅ์ค์ ์ด ๋ชจ๋ ๋๋ฌ์ผ๋ ๊ฒฐ๊ตญ์๋ ์ ํจ์ฑ ๊ฒ์ฌ์ ์ํด ์ด๋์ด ๋๋๊ฒ ๋๊ณ , ๊ทธ ๋์ sec๋ฅผ ์ถ๋ ฅํด์ค๋ค.
3. ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N, K, L, sec, y, x, d;
static int[][] map;
static Queue<Loc> bodyQ = new ArrayDeque<> ();
static Queue<Dir> dirQ = new ArrayDeque<> ();
static int[] dy = {0,1,0,-1};
static int[] dx = {1,0,-1,0};
static final int BLANK = 0;
static final int APPLE = 1;
static final int BODY = 2;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine());
map = new int[N+1][N+1];
K = Integer.parseInt(br.readLine());
for (int i=0; i<K; i++) {
st = new StringTokenizer(br.readLine());
int appleY = Integer.parseInt(st.nextToken());
int appleX = Integer.parseInt(st.nextToken());
map[appleY][appleX] = APPLE;
}
L = Integer.parseInt(br.readLine());
for (int i=0; i<L; i++) {
st = new StringTokenizer(br.readLine());
int second = Integer.parseInt(st.nextToken());
String direction = st.nextToken();
dirQ.offer(new Dir(second, direction));
}
// ์
๋ ฅ ๋
y = 1;
x = 1;
d = 0;
map[y][x] = BODY;
bodyQ.offer(new Loc(y, x));
move();
System.out.println(sec);
}
static void move() {
while (true) {
sec++;
int ny = y+dy[d];
int nx = x+dx[d];
if (ny<=0 || ny>N || nx<=0 || nx>N) break;
if (map[ny][nx] == BODY) break;
if (map[ny][nx] == BLANK && !bodyQ.isEmpty()) {
Loc tail = bodyQ.poll();
map[tail.y][tail.x] = BLANK;
}
y = ny;
x = nx;
map[y][x] = BODY;
bodyQ.offer(new Loc(y, x));
// ๋ฐฉํฅ์ค์
setDir();
}
}
static void setDir() {
if (dirQ.isEmpty()) return;
if (sec == dirQ.peek().second) {
Dir dir = dirQ.poll();
if ("D".equals(dir.direction)) {
d = (d+1)%4;
}
else if ("L".equals(dir.direction)) {
d--;
if (d<0) d = 3;
}
}
}
static class Loc {
int y, x;
Loc(int y, int x) {
this.y = y;
this.x = x;
}
}
static class Dir {
int second;
String direction;
Dir (int second, String direction) {
this.second = second;
this.direction = direction;
}
}
}
4. ์ฌ๋ด
์๊ฐ๊ฐ๋์ค ๋ชจ๋ฅด๊ณ ์ฌ๋ฐ๊ฒ ํ์๋ค.
์ธํผํ ๋๋ ์ฝ๋์ ๊ฐ๋ ์ฑ, ํด๋ฆฐ์ฝ๋๋ ๋ท์ ์ด๊ณ ์ด๋ป๊ฒ๋ ๋ต๋ง ๋์ค๊ฒ ํ๋ฉด ๋๋ค! ์์ผ๋
ํ์ฌ๋ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ค์ค๋ก ๊ฐ๋ ์ฑ์ ์ ๊ฒฝ์ฐ๋ฉด์ ์ง๊ณ ์๋ค๊ณ ๋๊ผ๋ค. (๊ทธ๋ ๋ค๊ณ ๊ฐ๋ ์ฑ์ด ์ข์์ง๊ฑด ์๋)
๋ฌผ๋ก ํจ์จ์ ์ด์ง ์์ ์๋ ์๊ฒ ์ง๋ง, ํ์คํ ์ด์ ๋ณด๋ค๋ ๊ฐ๋ ์ฑ์ด ๋์์ ธ์ ๊ทธ๋ฐ์ง
๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๋ด๊ฐ ํท๊ฐ๋ ค์ ๋ค์ ์ฝ๋๋ฅผ ์๋ค๊ฐ๋ค ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์ค์ด๋ ๊ฒ ๊ฐ๋ค.
๋ค๋ฅธ ๋ฌธ์ ๋ค์ ๋ ๋ง์ด ํ์ด๋ด์ผ ์ ๋ง๋ก ๊ทธ๋ฐ์ง ์๊ฐํด๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 21610 ๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ผ๊ธฐ - Java (0) | 2023.10.14 |
---|---|
[BOJ] 1182 ๋ถ๋ถ์์ด์ ํฉ - Java (1) | 2023.09.16 |
[BOJ] 13458 ์ํ๊ฐ๋ - Java (0) | 2023.09.13 |
[BOJ] 14501 ํด์ฌ - Java (0) | 2023.06.01 |
[BOJ] 14503 ๋ก๋ด์ฒญ์๊ธฐ - Java (0) | 2023.05.29 |