개발/코딩테스트

게임맵 최단거리

캐리캐리 2024. 12. 29. 16:24

문제 

ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다. 따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다.

cf) 문제의 양이 너무 많아서 링크로 대체 합니다. 

https://school.programmers.co.kr/learn/courses/30/lessons/1844

 

풀이 

주요생각 

4방향으로 이동 하여 거리를 이동하되 음수 이거나 이미 방문 했을 경우는 재방문을 하지 않는다 

4방향  = { {1,0} , {0,1} , {-1,0} , {0,-1} }

방문 여부 boolean[][] visited 

queue에 저장될 값은 해당 좌표의 위치와 현재 거리를 얼마나 이동햇는지에 대한 값이 필요하다 

좌표가 마지막으로 이동하면 작업을 종료하고 해당 값을 반환한다 

만약 그전에 queue에 대상이 없어서 종료가 되면 -1을 반환하도록 한다 

 

   public int solution(int[][] maps) {
   	int[][] array = { {1,0} ,{0,1} ,{-1,0},{0,-1} };
   	int x = maps.length;
    int y = maps[0].length;
    boolean[][]visited = new boolean[x][y];
    Queue<int[]> queue = new LinkedList<>();
    
    queue.add(new int[]{0,0,1});
    visited[0][0] = 1;
    while(!queue.isEmpty()){
		    int[] poll = queue.poll();
            int pollX = poll[0];
            int pollY = poll[1];        
            int answer = poll[2];  
            if(pollX == x-1 && pollY == y-1){
                return answer 
            }
        for(int i=0; i<array.length;i++){
            int[] depth = array[i];
            int depthX = pollX+depth[0];
            int depthY = pollY+depth[1];            
			
            if(depthX>=0 && depthY>=0 && depthX <x && depthY <y
            && !visited[depthX][depthY]
            && maps[depthX][depthY] !=0){
            	queue.add(new int[]{depthX,depthY,answer+1})
            }
        }
    
    }
    
   	return -1;
   }