[프로그래머스] 공원 산책

fsm12·2023년 7월 13일
0

프로그래머스

목록 보기
35/57
post-thumbnail

문제링크

문제 이해

[ 입력형태 / 조건 ]

park
상수에게 전해지는 재료의 정보를 나타내는 정수 배열 | ["SOO","OOO","OOO"] | 3 ≤ park의 길이 ≤ 50, 3 ≤ park[i]의 길이 ≤ 50, park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어짐

routes
로봇 강아지가 수행할 명령어를 담은 배열 | ["E 2","S 2","W 1"] | 1 ≤ routes의 길이 ≤ 50, 각 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미

[ 문제 ]

로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return

[ 풀이 ]

Map에 동서남북 좌표 정보를 저장한 뒤, routes 명령어대로 움직이면서 cnt 증가, 한번이라도 이동못하는 구역을 마주친다면 cnt 만큼 방향 좌표대로 값을 감소



코드

> [성공] 1차 시도 : 구현

  • 생각한 풀이 그대로 구현
import java.util.*;

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int[] ans = new int[2];
        
        Map<Character, int[]> xy = new HashMap<>();
        xy.put('N', new int[]{-1,0});
        xy.put('S', new int[]{1,0});
        xy.put('W', new int[]{0,-1});
        xy.put('E', new int[]{0,1});
        
        int N = park.length, M = park[0].length();
        for(int n=0; n<N; n++){
            for(int m=0; m<M; m++){
                if(park[n].charAt(m) == 'S'){
                    ans = new int[]{n,m};
                    break;
                }
            }
        }
        
        for(String route : routes){
            int[] dxdy = xy.get(route.charAt(0));
            int move = route.charAt(2) - '0';
            
            int nx = ans[0], ny = ans[1];
            for(int n=0; n<move; n++){
                nx+=dxdy[0];
                ny+=dxdy[1];
                if(0<=nx && nx<N && 0<=ny && ny<M && park[nx].charAt(ny) != 'X'){
                    continue;
                }
                nx = ans[0];
                ny = ans[1];
                break;
            }
            ans[0] = nx;
            ans[1] = ny;
        }
        return ans;
    }
}



Tip : 장애물을 'X'라 표시하고 'X'구역은 가지 못한다고 할 때 [!='X' : 'X'가 아니다]로 주는 것이 낫다. 다른 마크와 같아야한다고 둘 경우, 또 다른 마크가 존재한다면 틀린 답이 된다.

0개의 댓글