๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.3190 ๋ฑ ๋ฌธ์ ํ์ด - java
๐ ๋ฌธ์
https://www.acmicpc.net/problem/3190
โDummyโ ๋ผ๋ ๋์ค๊ฒ์์ด ์๋ค. ์ด ๊ฒ์์๋ ๋ฑ์ด ๋์์ ๊ธฐ์ด๋ค๋๋๋ฐ, ์ฌ๊ณผ๋ฅผ ๋จน์ผ๋ฉด ๋ฑ ๊ธธ์ด๊ฐ ๋์ด๋๋ค. ๋ฑ์ด ์ด๋ฆฌ์ ๋ฆฌ ๊ธฐ์ด๋ค๋๋ค๊ฐ ๋ฒฝ ๋๋ ์๊ธฐ์์ ์ ๋ชธ๊ณผ ๋ถ๋ชํ๋ฉด ๊ฒ์์ด ๋๋๋ค.
๊ฒ์์ NxN ์ ์ฌ๊ฐ ๋ณด๋์์์ ์งํ๋๊ณ , ๋ช๋ช ์นธ์๋ ์ฌ๊ณผ๊ฐ ๋์ฌ์ ธ ์๋ค. ๋ณด๋์ ์ํ์ข์ฐ ๋์ ๋ฒฝ์ด ์๋ค. ๊ฒ์์ด ์์ํ ๋ ๋ฑ์ ๋งจ์ ๋งจ์ข์ธก์ ์์นํ๊ณ ๋ฑ์ ๊ธธ์ด๋ 1 ์ด๋ค. ๋ฑ์ ์ฒ์์ ์ค๋ฅธ์ชฝ์ ํฅํ๋ค.
๋ฑ์ ๋งค ์ด๋ง๋ค ์ด๋์ ํ๋๋ฐ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฅธ๋ค.
- ๋จผ์ ๋ฑ์ ๋ชธ๊ธธ์ด๋ฅผ ๋๋ ค ๋จธ๋ฆฌ๋ฅผ ๋ค์์นธ์ ์์น์ํจ๋ค.
- ๋ง์ฝ ์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ๊ทธ ์นธ์ ์๋ ์ฌ๊ณผ๊ฐ ์์ด์ง๊ณ ๊ผฌ๋ฆฌ๋ ์์ง์ด์ง ์๋๋ค.
- ๋ง์ฝ ์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ๋ชธ๊ธธ์ด๋ฅผ ์ค์ฌ์ ๊ผฌ๋ฆฌ๊ฐ ์์นํ ์นธ์ ๋น์์ค๋ค. ์ฆ, ๋ชธ๊ธธ์ด๋ ๋ณํ์ง ์๋๋ค.
- ์ฌ๊ณผ์ ์์น์ ๋ฑ์ ์ด๋๊ฒฝ๋ก๊ฐ ์ฃผ์ด์ง ๋ ์ด ๊ฒ์์ด ๋ช ์ด์ ๋๋๋์ง ๊ณ์ฐํ๋ผ.
๐ ์ ๊ทผ๋ฒ
boj Q.3190 ๋ฑ ๋ฌธ์ ์ ๋๋ค. ๋ฌธ์ ์์ ์ฃผ์ด์ง๋ โDummyโ๋ผ๋ ๋์ค๊ฒ์์์
์ฌ๊ณผ์ ์์น์ ๋ฑ์ ์ด๋๊ฒฝ๋ก๊ฐ ์ฃผ์ด์ง ๋ ์ด ๊ฒ์์ด ๋ช ์ด์ ๋๋๋์ง๋ฅผ ๊ณ์ฐํ๋ ๋ฌธ์ ์ ๋๋ค.
๊ฒ์์์ ์ฃผ์ด์ง๋ ๊ท์น์ ์ด์ฉํ์ฌ ํ์ด๋ฅผ ํ๋ ๋ฌธ์ ์ ๋๋ค.
์ฃผ์ด์ง๋ ๊ท์น์ ๋น ๋ฅด๊ฒ ์ ์ดํดํ๊ณ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๊ฒ์ํ์ N*N ์ ์ฌ๊ฐ ๋ณด๋์์์ ์งํ๋๊ณ ๋ฑ์ ์ฒซ ์์ ์์น๋ ๋ฌด์กฐ๊ฑด ๋งจ์ ๋งจ์ข์ธก์ผ๋ก ๊ณ ์ ๋์ด์์ต๋๋ค.
-
๋ฑ์ ์ฐ์ ๋ชธ๊ธธ์ด๋ฅผ ๋๋ ค ๋จธ๋ฆฌ๋ฅผ ๋ค์์นธ์ ์์น์ํต๋๋ค.
- ์ฌ๊ธฐ์ ๋จธ๋ฆฌ๋ฅผ ๋ด๋ฐ์ด ์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด ์ฌ๊ณผ๊ฐ ์์ด์ง๊ณ ๊ผฌ๋ฆฌ๋ ์ ์ง๋ฉ๋๋ค. ๋ฑ์ ๊ธธ์ด๊ฐ ๋์ด๋ฉ๋๋ค. - ์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด ๊ผฌ๋ฆฌ์ ์์นํ ์นธ์ ๋น์์ค๋๋ค. ์ฆ, ๊ผฌ๋ฆฌ๊ฐ ์ ์ง๋์ง ์๊ณ ์ค์ด๋ญ๋๋ค. - ๋ฑ์ ์์ ์ ๋ชธ ์์น ๋ํ ํ์ํด์ค์ผํฉ๋๋ค.
-
๋ฑ์ ์ฃผ์ด์ง ์๊ฐ๋๋ง๋ค ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐฉํฅ์ ์ ํํฉ๋๋ค.
- ๋ฑ์ ๋จธ๋ฆฌ๊ฐ ์์ ์ ๋ชธ์ด๋ ๋ฒฝ์ ๋ฟ๊ฒ๋๋ค๋ฉด ๊ฒ์์ ๋์ด ๋ฉ๋๋ค.
1๋ฒ ๊ท์น
- ๋ฌด์กฐ๊ฑด ๋ฑ์ ์ฒซ ์์ ์์น๋ ๋ฌด์กฐ๊ฑด ๋งจ์ ๋งจ์ข์ธก์ผ๋ก ๊ณ ์ ๋์ด์์ต๋๋ค. ๊ฒ์์ ์์์ ์ด ์ ํด์ง๋๋ค.
2๋ฒ ๊ท์น
- ์ฐ์ ๋จธ๋ฆฌ๋ฅผ ์งํ ๋ฐฉํฅ์ผ๋ก ํ ์นธ ๋ด๋ฏธ๋ ๊ฒ์ ๊ณตํต์ ์ด๋ , ์ฌ๊ณผ๊ฐ ์์ ๋๋ ๊ผฌ๋ฆฌ๊ฐ ์ ์ง๋๊ณ ์์ผ๋ฉด ๊ผฌ๋ฆฌ๊ฐ ์ฌ๋ผ์ง๋๋ค.
๋จธ๋ฆฌ ํ ์นธ์ ๋ด๋ฏธ๋ ๋ฐ ์ฌ๊ณผ์ ์ ๋ฌด์ ๋ฐ๋ผ ๊ผฌ๋ฆฌ๊ฐ ์์ด์ง๋๋ค -> ๋ฑ์ ์ด์ฉํด์ ํ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
3๋ฒ ๊ท์น
- ์ฃผ์ด์ง ์๊ฐ๋๋ง๋ค ์งํ ๋ฐฉํฅ์ ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ํํด์ค๋๋ค.
4๋ฒ ๊ท์น
- ์ด๋ฏธ board ํ์ ๋ฒฝ์ธ์ง ์์ ์ ๋ชธ์ด ์์นํด์๋์ง๊ฐ ํ์๋์ด์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ด์ฉํด ํ์ธํฉ๋๋ค.
๊ท์น๋ค์ ํ์ ํ๊ณ ์ ์ฉํ๋ ๊ณผ์ ์์ ์ค์๋ค์ด ์์์ต๋๋ค.
์ญ์ ๋ฌธ์ ์์ ์ฃผ์ด์ง๋ ๊ท์น์ ์ ์ดํดํ๊ณ ํ์ ํด ์ ์ฉํ๋ ๊ฒ์ด ์ค์ํ์ต๋๋ค.
๐ป ์ฝ๋
package problem.implementation;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main_3190 {
static int n ,l,k;
static int board[][];
static boolean visited[][];
static Map<Integer,String> rotateTime = new HashMap<>();
static Map<Integer,Integer[]> directionInfo = new HashMap<>();
static Deque<Integer[]> deque = new ArrayDeque<>();
public static void main(String[] args) throws IOException {
input();
directionInfo.put(1,new Integer[]{0,1}); // ๋ โ
directionInfo.put(2,new Integer[]{1,0}); // ๋จ โ
directionInfo.put(3,new Integer[]{0,-1}); // ์ โ
directionInfo.put(4,new Integer[]{-1,0}); // ๋ถ โ
solve();
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
l = Integer.parseInt(br.readLine());
board = new int[n+1][n+1];
visited = new boolean[n+1][n+1];
for(int i=0; i<l; i++){
String temp[] = br.readLine().split(" ");
int r = Integer.parseInt(temp[0]);
int c = Integer.parseInt(temp[1]);
board[r][c] = 1;
}
k = Integer.parseInt(br.readLine());
for(int i=0; i<k; i++){
String temp[] = br.readLine().split(" ");
rotateTime.put(Integer.parseInt(temp[0]),temp[1]);
}
br.close();
}
private static void solve(){
int currentDirection = 1; // ์ค๋ฅธ์ชฝ ์์
int r = 1,c =1;
int time = 0;
deque.add(new Integer[]{1,1});
board[1][1] = 2;
while (true){
time++;
Integer[] move = directionInfo.get(currentDirection);
Integer[] currentHead = deque.getFirst();
r=currentHead[0]+move[0];
c=currentHead[1]+move[1];
if (r < 1 || c < 1 || r > n || c > n || board[r][c]==2)
break;
if(board[r][c] == 1) { // ๋จธ๋ฆฌ ์์น์ ์ฌ๊ณผ๊ฐ ์์ ๋ ๊ผฌ๋ฆฌ ์ ์ง
board[r][c] = 2;
deque.offerFirst(new Integer[]{r,c});
}
else{ // ๋จธ๋ฆฌ ์์น์ ์ฌ๊ณผ๊ฐ ์์ ๋ ๊ผฌ๋ฆฌ ์ ๊ฑฐ
board[r][c] = 2;
deque.offerFirst(new Integer[]{r,c});
Integer[] tailPosition = deque.removeLast();
board[tailPosition[0]][tailPosition[1]]=0;
}
if(rotateTime.containsKey(time)){
String rotation = rotateTime.get(time);
if(rotation.equals("D")){
currentDirection++;
}
else{
currentDirection--;
}
if(currentDirection > 4){
currentDirection = 1;
}
if(currentDirection < 1){
currentDirection = 4;
}
}
}
System.out.println(time);
}
}