코딩 테스트(Coding Test)/프로그래머스

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

배씌 2023. 5. 28. 19:02

 

코딩테스트 연습 - 공원 산책 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr


1. 아이디어

처음에는 boolean 타입의 2차원 배열 형태로 문제를 접근했으나, 이전 문제에서 시간초과에 한번 데인적이 있기 때문에 이중 루프를 이용하면 또다시 시간 초과가 뜰 것이라 생각하여 기존의 입력받은 문자열 배열 형태에서 값에 접근하고자 하였다.

 

우선 이 문제의 핵심 key 는 시작위치 "S" 라 생각하였고, 이를 토대로 route 명령어를 수행하며 true, false 유무를 따지면 되겠다 생각하였다. route 명령어 4가지는 각각

 

N : 북쪽으로 주어진 칸만큼 이동 -> park[(y좌표+n)] 

S : 남쪽으로 주어진 칸만큼 이동 -> park[(y좌표-n)]

W : 서쪽으로 주어진 칸만큼 이동 -> park[(y좌표 고정)].charAt(i-n)

E : 동쪽으로 주어진 칸만큼 이동 -> park[(y좌표 고정)].charAt(i+n)

 

으로 생각하여 접근했다.

 

이를 통해 각각의 메소드 4가지를 만들어 이동가능한지 체크하였고, route 명령어에 맞는 메소드를 실행하도록 구현했다.

명령어가 N일때의 경우만 예시로 들어보겠다.

public static boolean checkNorth(int startX, int startY, String[] park, int n){
        if((startY - n) < 0)
            return false;

        for(int i=startY; i>=(startY-n); i--)
            if(park[i].charAt(startX) == 'X')
                return false;

        return true;
}

N 명령어를 실행 할 수 있는 지 확인 후,

case 'N':
    if(checkNorth(startX, startY, park, n))
        startY -= n;
    break;

이와 같이 Y 좌표에 n만큼 빼주는 형태로 구현하였다.


2. 코드

class Solution {
    public static boolean checkNorth(int startX, int startY, String[] park, int n){
        if((startY - n) < 0)
            return false;

        for(int i=startY; i>=(startY-n); i--)
            if(park[i].charAt(startX) == 'X')
                return false;

        return true;
    }
    public static boolean checkSouth(int startX, int startY, int h, String[] park, int n){
        if((startY + n) > h-1)
            return false;
        
        for(int i=startY; i<=(startY+n); i++)
                if(park[i].charAt(startX) == 'X')
                    return false;
        
        return true;
    }
    public static boolean checkWest(int start, String s, int n){
        if((start - n) < 0)
            return false;

        for(int i=start; i>=(start-n); i--){
            if(s.charAt(i) == 'X')
                return false;
        }
        return true;
    }
    public static boolean checkEast(int start, int w, String s, int n){
        if((start + n) > w-1)
            return false;
        
        for(int i=start; i<=(start+n); i++)
                if(s.charAt(i) == 'X')
                    return false;

        return true;
    }
    
    public int[] solution(String[] park, String[] routes) {
        int w = park[0].length();
        int h = park.length;
        
        int startX = 0, startY = 0;
        
        for(int i=0; i<h; i++){
            if(park[i].contains("S")){
                startY = i;
                break;
            }
        }
        for(int i=0; i<w; i++){
            if(park[startY].charAt(i) == 'S'){
                startX = i;
                break;
            }
        }
        
        for(int i=0; i<routes.length; i++){
            char c = routes[i].charAt(0);
            int n = routes[i].charAt(2)-48;
            switch(c){
                case 'N':
                    if(checkNorth(startX, startY, park, n))
                        startY -= n;
                    break;

                case 'S':
                    if(checkSouth(startX, startY, h, park, n))
                        startY += n;
                    break;

                case 'W':
                    if(checkWest(startX, park[startY], n))
                        startX -= n;
                    break;

                case 'E':
                    if(checkEast(startX, w, park[startY], n))
                        startX += n;
                    break;
            }
        }
        
        int[] result = new int[2];
        result[0] = startY;
        result[1] = startX;
        
        return result;
    }
}