최코딩의 개발

[백준 3190번] 뱀 본문

코딩테스트/백준

[백준 3190번] 뱀

seung_ho_choi.s 2025. 4. 1. 21:58
728x90

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

 

package datastructure;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class DataStructure3190 {
    static int N;

    static int[][] map;
    static Queue<Object[]> state;


    // 북 동 남 서
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        int K = Integer.parseInt(br.readLine());
        map = new int[N][N];

        StringTokenizer st;

        for (int i = 0; i < K; i++) {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            // 사과 배정
            map[x - 1][y - 1] = 2;
        }

        int L = Integer.parseInt(br.readLine());
        state = new LinkedList<>();
        for (int i = 0; i < L; i++) {
            st = new StringTokenizer(br.readLine());
            int cnt = Integer.parseInt(st.nextToken());
            String alarm = st.nextToken();
            state.add(new Object[]{cnt, alarm});
        }

        System.out.println(bfs());
    }

    public static int bfs() {
        Deque<int[]> deque = new ArrayDeque<>();
        deque.add(new int[]{0, 0});
        int time = 0;
        int dir = 1;

        while (!deque.isEmpty()) {
            int[] poll = deque.peekLast();
            int x = poll[0];
            int y = poll[1];

            // 방향 전환
            if (!state.isEmpty()) {
                Object[] peek = state.peek();
                if (time == (int) peek[0]) {

                    if (peek[1].equals("D")) {
                        dir = dir + 1 > 3 ? 0 : dir + 1;
                        //System.out.println(x + " " + y);
                    } else if (peek[1].equals("L")) {
                        //System.out.println(x + " " + y);
                        dir = dir - 1 < 0 ? 3 : dir - 1;
                    }
                    state.poll();
                }
            }



            //이동
            int nX = x + dx[dir];
            int nY = y + dy[dir];

            // 벽
            if (nX >= N || nY >= N || nX < 0 || nY < 0) {
                break;
            }
            // 내 자신
            if (map[nX][nY] == 1) {
                break;
            }
            // 사과
            if (map[nX][nY] == 2) {
                map[nX][nY] = 1;
                deque.add(new int[]{nX, nY});
            } else {

                int[] first = deque.poll();
                map[first[0]][first[1]] = 0;
                map[nX][nY] = 1;
                deque.add(new int[]{nX, nY});
            }


            time++;
        }

        return time + 1;
    }


}

 

 

 

방향 때문에 헷갈렸던 문제이다. 남쪽으로 가다가 L을 만나면 동쪽으로 돌아서야 하는데, 이 과정을 어떻게 구현할지 고민이 많았다. 그래서 삼항 연산자를 사용하여 D일 때는 dist + 1 > 3, L일 때는 dist - 1 < 0을 이용해 방향을 구했다. Deque를 사용하는 이유는 요소들이 이동할 때마다 위치를 저장하고, 마지막 위치를 이용해 방향을 계산해야 하기 때문이다. 또한, 이동 후에는 맨 앞 요소를 삭제해야 하기 때문에 Deque가 적합했다.

 

 

근데 솔직히 다 쉬었고 사실상 이 문제의 핵심은 방향 전환이다.

728x90

'코딩테스트 > 백준' 카테고리의 다른 글

[백준 2805번] 나무 자르기  (0) 2025.04.01
[백준 11052번] 카드 구매하기  (0) 2025.03.25
[백준 2156번] 포도주 시식  (0) 2025.03.25
[백준 15666번] 로봇 조종하기  (0) 2025.03.24
[백준 15666번] N과 M(12)  (0) 2025.03.23