리코챗로봇

Lee1231234·2023년 5월 3일

코딩테스트

목록 보기
49/95


전형적인 BFS문제 이전에 풀었던 미로탈출과 같은 문제이다 다른점은 한번에 끝까지 이동한다는점. 이것도 마찬가지로 우선순위큐를 사용할 필요가 없는데 가중치가 1이기 때문에 큐에 낮은값부터 빠져나오기 때문이다.

코드

import java.util.*;
class Solution {
    boolean[][] visit;
    public int solution(String[] board) {
        char[][] map =new char[board.length][board[0].length()];
        visit =new boolean[board.length][board[0].length()];
        int[] start= new int[3];
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[0].length();j++){
                map[i][j]=board[i].charAt(j);               
             
                if(board[i].charAt(j)=='R'){
                    map[i][j]='.';
                    start[0]=i;
                    start[1]=j;
                }
            }
        }
        int answer = 0;
        answer=moveRobot(start,map);
       
        return answer;
    }
    public int moveRobot(int[] start,char[][] map){
        PriorityQueue<int[]> q = new PriorityQueue<>((o1,o2)->o1[2]-o2[2]);
//        Queue<int[]> q = new LinkedList<>();
        q.add(start);
        visit[start[0]][start[1]]=true;
        while(!q.isEmpty()){
            int[] tmp=q.poll();
            if(map[tmp[0]][tmp[1]]=='G') return tmp[2];
            for(int i=0;i<4;i++){
                int[] tmp2=move(i,tmp.clone(),map);
                if(!visit[tmp2[0]][tmp2[1]]){
                    tmp2[2]++;
                    q.add(tmp2);
                    visit[tmp2[0]][tmp2[1]]=true;                 
                }
            }
        }
        return -1;
    }
    public int[] move(int i,int[] t,char[][] map){
        boolean flag= true;
        while(flag){
            switch(i){
                case 0:
                    if(t[0]+1<visit.length&&map[t[0]+1][t[1]]!='D'){
                        t[0]++;
                    }else  flag=false;
                    break;
                case 1:
                     if(t[0]-1>=0&&map[t[0]-1][t[1]]!='D'){
                        t[0]--;
                    }else flag=false;
                    break;
                case 2:
                     if(t[1]+1<visit[0].length&&map[t[0]][t[1]+1]!='D'){
                        t[1]++;
                    }else flag=false;
                    break;
                case 3:
                     if(t[1]-1>=0&&map[t[0]][t[1]-1]!='D'){
                        t[1]--;
                    }else flag=false;
                    break;
            }
        }
        return t;
    }
}
profile
not null

0개의 댓글