본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 172928번: 공원 산책 [Java]

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

 

프로그래머스

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

programmers.co.kr

1. 코드

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int[][] move = {
            {-1, 0},
            {1, 0},
            {0, -1},
            {0, 1}
        };
        
        int[] position = new int[2];
        for(int i = 0; i < park.length; i++) {
            if(park[i].contains("S")) {
                position[0] = i;
                position[1] = park[i].indexOf("S");
                break;
            }
        }
        
        for(String r : routes) {
            int direction = 0;
            switch(r.charAt(0)){
                case 'N' -> direction = 0;
                case 'S' -> direction = 1;
                case 'W' -> direction = 2;
                case 'E' -> direction = 3;
            }
            
            int repeat = Integer.parseInt(r.substring(2));
            int[] temp = position.clone();
            for(int i = 0; i < repeat; i++) {
                temp[0] += move[direction][0];
                temp[1] += move[direction][1];
                if(temp[0] < 0 || temp[1] < 0 || temp[0] >= park.length || temp[1] >= park[0].length() || park[temp[0]].charAt(temp[1]) == 'X') {
                    temp = position.clone();
                    break;
                }
            }
            position = temp.clone();
        }
        return position;
    }
}

2. 설명

int[][] move = {
    {-1, 0},
    {1, 0},
    {0, -1},
    {0, 1}
};

1 행부터 N, S, W, E 방향의 움직임입니다.

int[] position = new int[2];
for(int i = 0; i < park.length; i++) {
    if(park[i].contains("S")) {
        position[0] = i;
        position[1] = park[i].indexOf("S");
        break;
    }
}

현재 위치를 반복문을 통해서 파악합니다.

for(String r : routes) {
    int direction = 0;
    switch(r.charAt(0)){
        case 'N' -> direction = 0;
        case 'S' -> direction = 1;
        case 'W' -> direction = 2;
        case 'E' -> direction = 3;
    }

방향에 맞춰서 move 인덱스 값을 저장합니다.

    int repeat = Integer.parseInt(r.substring(2));
    int[] temp = position.clone();
    for(int i = 0; i < repeat; i++) {
        temp[0] += move[direction][0];
        temp[1] += move[direction][1];
        if(temp[0] < 0 || temp[1] < 0 || temp[0] >= park.length || temp[1] >= park[0].length() || park[temp[0]].charAt(temp[1]) == 'X') {
            temp = position.clone();
            break;
        }
    }
    position = temp.clone();
}

repeat에 반복 횟수에 대한 정보를 저장하고 temp에 position 값을 복사합니다. 반복문을 통해서 움직이고자 하는 위치에 방해물이 없는지 위치가 없는지 확인합니다. 만약 해당된다면 temp에 position 값을 복사한 뒤 반복문을 탈출함으로써 이동하지 않음으로 처리합니다.

만약 문제가 없다면 이동된 상태를 저장하기 위해 temp의 값을 postion에 저장합니다.

3. 정리

  1. 배열에서의 상하좌우의 움직임을 구현한다면 쉽게 해결 가능하다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges