똘이의 개발 Life

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

코딩테스트/프로그래머스

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

또리또리똘 2024. 1. 8. 18:56
728x90

문제 출처

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

걸린 시간

17:27 ~ 18:35 , 18:45 ~ 18:52 // 소요 시간 : 1시간 15분

피드백

Graph 개념을 이해하고 적용할 수 있는가?

좀 차분하게 풀자 제발…

 

문제

지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다.

산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.

  • ["방향 거리", "방향 거리" … ]

예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.

  • 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
  • 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.

위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.

공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.

 

공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

제한 사항

  • today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
  • 1 ≤ terms의 길이 ≤ 20
    • terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
    • 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
    • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
  • 1 ≤ privacies의 길이 ≤ 100
    • privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
    • privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
    • 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
    • privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
  • today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
    • 2000 ≤ YYYY ≤ 2022
    • 1 ≤ MM ≤ 12
    • MM이 한 자릿수인 경우 앞에 0이 붙습니다.
    • 1 ≤ DD ≤ 28
    • DD가 한 자릿수인 경우 앞에 0이 붙습니다.
  • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.

문제 풀이

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int[] answer = new int[2];
        
        // 공원의 세로 길이 
        int SE = park.length;
        // 공원의 가로 길이
        int GA = park[0].split("").length;
        // 공원 이중 배열로 표시
        String[][] P = new String[SE][GA];
        
        // 시작 위치 세팅
        for( int i = 0; i < park.length ; i++ ){
            String [] parkN = park[i].split("");
            for( int j = 0 ; j < parkN.length ; j++ ){
                // 값 삽입
                P[i][j] = parkN[j];
                if( "S".equals(parkN[j])){
                    // 시작 점 answer 배열에 넣기
                    answer[0] = i; // 세로
                    answer[1] = j; // 가로
                    
                }
            }
        }
        
        
        
        for( String route : routes ){
            char op = route.charAt(0);
            int n = Integer.parseInt(route.substring( 2 , 3 ));
            boolean okFlag = true;    
            // 현재 위치 
            int now_se = answer[0];
            int now_ga = answer[1];
            for( int cnt = 0; cnt < n ; cnt++ ){
                //동쪽으로 n 번갈 때
                if(op == 'E') {
                    // 밖으로 벗어나지 않고 장애물이 없을 때
                    if( now_ga + 1 < GA && !P[now_se][now_ga+1].equals("X") ){
                        now_ga++;
                    }
                    // 밖으로 나가거나 장애물이 있다면
                    else{
                        okFlag = false;
                        break;
                    }
                }
                // 서쪽으로 n 번 갈 때
                if(op == 'W'){
                    // 밖으로 벗어나지 않고 장애물이 없을 때
                    // ( 0, 0 ) 까지 허용임으로 0 보다 크거나 같다라고 표시해야함.
                    if( now_ga - 1 >= 0 && !P[now_se][now_ga-1].equals("X") ){
                        now_ga--;
                    }
                    // 밖으로 나가거나 장애물이 있다면
                    else{
                        okFlag = false;
                        break;
                    }
                }
                // 남쪽으로 n 번 갈 때
                if(op == 'S'){
                    
                    // 밖으로 벗어나지 않고 장애물이 없을 때
                    if( now_se + 1 < SE && !P[now_se+1][now_ga].equals("X") ){
                        now_se++;
                    }
                    // 밖으로 나가거나 장애물이 있다면
                    else{
                        okFlag = false;
                        break;
                    }
                }
                // 남쪽으로 n 번 갈 때
                if(op == 'N'){
                    // 밖으로 벗어나지 않고 장애물이 없을 때
                    // ( 0, 0 ) 까지 허용임으로 0 보다 크거나 같다라고 표시해야함.
                    if( now_se - 1 >= 0 && !P[now_se-1][now_ga].equals("X") ){
                        now_se--;
                    }
                    // 밖으로 나가거나 장애물이 있다면
                    else{
                        okFlag = false;
                        break;
                    }
                }
            }
            
            if(okFlag){
                answer[0] = now_se;
                answer[1] = now_ga;
            }
        }
                
        return answer;
    }
}

 

728x90