백준 2564번 경비원

이상민·2023년 9월 18일
0

알고리즘

목록 보기
55/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Guard {
    static int N,M,num;

    static int[] dr = {0,1,-1,0};
    static int[] dc = {1,0,0,-1};
    static int sum = 0;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        num = Integer.parseInt(st.nextToken());
        List<int[]> list = new ArrayList<>();
        int dir = 0;
        int point =0;
        for (int i = 0; i <num ; i++) {
            st = new StringTokenizer(br.readLine());
            dir = Integer.parseInt(st.nextToken());
            point = Integer.parseInt(st.nextToken());
            list.add(new int[]{dir,point});
        }
        int[] guard = new int[2];
        st = new StringTokenizer(br.readLine());
        guard[0] = Integer.parseInt(st.nextToken());
        guard[1] = Integer.parseInt(st.nextToken());

        for (int i = 0; i < num; i++) {
            int[][] map = new int[M+1][N+1];
            boolean[][] visited = new boolean[M+1][N+1];
            bfs(map,guard[0],guard[1],list.get(i),visited);
        }
        System.out.println(sum);

    }
    public static void bfs(int[][] map,int dir, int point,int[] market,boolean[][] visited){
        int row = 0;
        int col = 0;
        if(dir==1){
            row = M;
            col = point;
        }else if(dir==2){
            row = 0;
            col = point;
        }else if(dir==3){
            row = M-point;
            col = 0;
        }else if(dir==4){
            row = M-point;
            col = N;
        }
        int mrow = 0;
        int mcol = 0;
        if(market[0]==1){
            mrow = M;
            mcol = market[1];
        }else if(market[0]==2){
            mrow = 0;
            mcol = market[1];
        }else if(market[0]==3){
            mrow = M-market[1];
            mcol = 0;
        }else if(market[0]==4){
            mrow = M-market[1];
            mcol = N;
        }

        Queue<int[]> que = new LinkedList<>();
        que.add(new int[]{row,col});
        while (!que.isEmpty()){
            int[] current = que.poll();
            int crow = current[0];
            int ccol = current[1];
            for (int i = 0; i < 4; i++) {
                int nrow = crow + dr[i];
                int ncol = ccol + dc[i];
                if(nrow<0||ncol<0||nrow>=M+1||ncol>=N+1)
                    continue;
                if(nrow==0||ncol==0||nrow==M||ncol==N){
                    if(!visited[nrow][ncol]){
                        visited[nrow][ncol] = true;
                        map[nrow][ncol] = map[crow][ccol]+1;
                        if(nrow==mrow&&ncol==mcol){
                            sum += map[nrow][ncol];
                            return;
                        }
                        que.add(new int[]{nrow,ncol});
                    }
                }
            }
        }

    }
}

풀이방법

이문제는 특이하게 좌표의 정보를 주지 않고, 방향정보와 거리를 입력값으로 준다.
이를 좌표로 바꾼뒤 접근하는방법을 사용했다.
1. 상점들의 방향정보,거리를 list에 저장한다.
2. 최단거리를 구해야하므로 bfs탐색을 사용한다.
3. 매 상점 탐색마다 bfs탐색을 하고, 매번 map과 visted를 초기화해준다.
4. 상점과, 내 위치를 좌표로 변환한다.(내 위치는 매번 같으므로 bfs함수 밖에서 변환하는 방법이 더 좋았겠다.)
5. 범위 지정이 중요한데, map에 테두리 값만 탐색가능하도록 지정한다.
6. 칸마다 맵의 값을 하나씩 늘려가며 탐색하고, 상점의 좌표에 도달하면 함수를 종료한다.

후기

나는 상점과 내 위치를 전부 좌표형태로 변환 시키고 bfs를 시도했는데,
변환 시키지 않으면서 bfs탐색하는 방법도 있었을 것 같다.
하지만, 익숙하지 않았고, 변환했을때 더 직관적인 것 같아서 변환해서 풀었다.

profile
개린이

0개의 댓글

Powered by GraphCDN, the GraphQL CDN