๐Ÿ“– [๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด] Q.3190 ๋ฑ€ ๋ฌธ์ œ ํ’€์ด - java

๐Ÿ“– ๋ฌธ์ œ

https://www.acmicpc.net/problem/3190

โ€˜Dummyโ€™ ๋ผ๋Š” ๋„์Šค๊ฒŒ์ž„์ด ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์—๋Š” ๋ฑ€์ด ๋‚˜์™€์„œ ๊ธฐ์–ด๋‹ค๋‹ˆ๋Š”๋ฐ, ์‚ฌ๊ณผ๋ฅผ ๋จน์œผ๋ฉด ๋ฑ€ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค. ๋ฑ€์ด ์ด๋ฆฌ์ €๋ฆฌ ๊ธฐ์–ด๋‹ค๋‹ˆ๋‹ค๊ฐ€ ๋ฒฝ ๋˜๋Š” ์ž๊ธฐ์ž์‹ ์˜ ๋ชธ๊ณผ ๋ถ€๋”ชํžˆ๋ฉด ๊ฒŒ์ž„์ด ๋๋‚œ๋‹ค.

๊ฒŒ์ž„์€ NxN ์ •์‚ฌ๊ฐ ๋ณด๋“œ์œ„์—์„œ ์ง„ํ–‰๋˜๊ณ , ๋ช‡๋ช‡ ์นธ์—๋Š” ์‚ฌ๊ณผ๊ฐ€ ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ๋ณด๋“œ์˜ ์ƒํ•˜์ขŒ์šฐ ๋์— ๋ฒฝ์ด ์žˆ๋‹ค. ๊ฒŒ์ž„์ด ์‹œ์ž‘ํ• ๋•Œ ๋ฑ€์€ ๋งจ์œ„ ๋งจ์ขŒ์ธก์— ์œ„์น˜ํ•˜๊ณ  ๋ฑ€์˜ ๊ธธ์ด๋Š” 1 ์ด๋‹ค. ๋ฑ€์€ ์ฒ˜์Œ์— ์˜ค๋ฅธ์ชฝ์„ ํ–ฅํ•œ๋‹ค.

๋ฑ€์€ ๋งค ์ดˆ๋งˆ๋‹ค ์ด๋™์„ ํ•˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.

  • ๋จผ์ € ๋ฑ€์€ ๋ชธ๊ธธ์ด๋ฅผ ๋Š˜๋ ค ๋จธ๋ฆฌ๋ฅผ ๋‹ค์Œ์นธ์— ์œ„์น˜์‹œํ‚จ๋‹ค.
  • ๋งŒ์•ฝ ์ด๋™ํ•œ ์นธ์— ์‚ฌ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ ์นธ์— ์žˆ๋˜ ์‚ฌ๊ณผ๊ฐ€ ์—†์–ด์ง€๊ณ  ๊ผฌ๋ฆฌ๋Š” ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค.
  • ๋งŒ์•ฝ ์ด๋™ํ•œ ์นธ์— ์‚ฌ๊ณผ๊ฐ€ ์—†๋‹ค๋ฉด, ๋ชธ๊ธธ์ด๋ฅผ ์ค„์—ฌ์„œ ๊ผฌ๋ฆฌ๊ฐ€ ์œ„์น˜ํ•œ ์นธ์„ ๋น„์›Œ์ค€๋‹ค. ์ฆ‰, ๋ชธ๊ธธ์ด๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์‚ฌ๊ณผ์˜ ์œ„์น˜์™€ ๋ฑ€์˜ ์ด๋™๊ฒฝ๋กœ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ์ด ๊ฒŒ์ž„์ด ๋ช‡ ์ดˆ์— ๋๋‚˜๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋ผ.

๐Ÿ” ์ ‘๊ทผ๋ฒ•

boj Q.3190 ๋ฑ€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง€๋Š” โ€˜Dummyโ€™๋ผ๋Š” ๋„์Šค๊ฒŒ์ž„์—์„œ

์‚ฌ๊ณผ์˜ ์œ„์น˜์™€ ๋ฑ€์˜ ์ด๋™๊ฒฝ๋กœ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ์ด ๊ฒŒ์ž„์ด ๋ช‡ ์ดˆ์— ๋๋‚˜๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ฒŒ์ž„์—์„œ ์ฃผ์–ด์ง€๋Š” ๊ทœ์น™์„ ์ด์šฉํ•˜์—ฌ ํ’€์ด๋ฅผ ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง€๋Š” ๊ทœ์น™์„ ๋น ๋ฅด๊ฒŒ ์ž˜ ์ดํ•ดํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ฒŒ์ž„ํŒ์€ N*N ์ •์‚ฌ๊ฐ ๋ณด๋“œ์œ„์—์„œ ์ง„ํ–‰๋˜๊ณ  ๋ฑ€์˜ ์ฒซ ์‹œ์ž‘ ์œ„์น˜๋Š” ๋ฌด์กฐ๊ฑด ๋งจ์œ„ ๋งจ์ขŒ์ธก์œผ๋กœ ๊ณ ์ •๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ฑ€์€ ์šฐ์„  ๋ชธ๊ธธ์ด๋ฅผ ๋Š˜๋ ค ๋จธ๋ฆฌ๋ฅผ ๋‹ค์Œ์นธ์— ์œ„์น˜์‹œํ‚ต๋‹ˆ๋‹ค.

     - ์—ฌ๊ธฐ์„œ ๋จธ๋ฆฌ๋ฅผ ๋‚ด๋ฐ€์–ด ์ด๋™ํ•œ ์นธ์— ์‚ฌ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด ์‚ฌ๊ณผ๊ฐ€ ์—†์–ด์ง€๊ณ  ๊ผฌ๋ฆฌ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋ฑ€์˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
     - ์ด๋™ํ•œ ์นธ์— ์‚ฌ๊ณผ๊ฐ€ ์—†๋‹ค๋ฉด ๊ผฌ๋ฆฌ์— ์œ„์น˜ํ•œ ์นธ์„ ๋น„์›Œ์ค๋‹ˆ๋‹ค. ์ฆ‰, ๊ผฌ๋ฆฌ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๊ณ  ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
     - ๋ฑ€์˜ ์ž์‹ ์˜ ๋ชธ ์œ„์น˜ ๋˜ํ•œ ํ‘œ์‹œํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.
    
  3. ๋ฑ€์€ ์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋•Œ๋งˆ๋‹ค ์™ผ์ชฝ ๋˜๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐฉํ–ฅ์„ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ฑ€์˜ ๋จธ๋ฆฌ๊ฐ€ ์ž์‹ ์˜ ๋ชธ์ด๋‚˜ ๋ฒฝ์— ๋‹ฟ๊ฒŒ๋œ๋‹ค๋ฉด ๊ฒŒ์ž„์€ ๋์ด ๋‚ฉ๋‹ˆ๋‹ค.

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);
    }
}

Written on April 14, 2021