우당탕탕 개발일지

[프로그래머스] 공원 산책 (Java, Level.1) 본문

코테/프로그래머스

[프로그래머스] 공원 산책 (Java, Level.1)

ujin302 2024. 7. 8. 16:34
반응형

문제

아래의 표시는 공원을 의미한다.  

S O O
O X O
O O O

 

S : 시작
O : 이동 가능
X : 장애물

 

[ 이동 방향 ]

N : 위
S : 아래
E : 앞으로
W : 뒤로

 

현재 위치에서 주어진 방향과 거리만큼 이동하여야 한다. 

이동하는 중에 장애물이 있다면 움직이기 전의 위치로 돌아가야 한다. 

 

주어진 이동 명령을 모두 수행 후, 최종 위치를 반환하세요. 

 

입출력 예

 

 

풀이

1. 변수

2. 공원 설정 

3. 이동 

 

1. 변수 

w, h : 공원의 가로 세로

x, y : 현재 좌표 

parkArr : 공원 그림 

 

2. 공원 설정

문자열 1차원 배열을 2차원 배열 문자열의 문자 1개씩 저장한다. 

시작 지점인 S을 만나면 시작 좌표를 저장한다. 

 

3. 이동

주어진 명령을 기준으로 반복문을 수행한다. 

 

tempX, tempY : 현재 좌표를 저장한다. 

move : 이동 방향 

count : 이동 거리 

 

이동 거리만큼 반복문을 수행한다. 

이동하는 방향은 +가 될수도 -가 될수도 있다. 따라서 이동 거리를 기준으로 반복문을 수행한다. 

반복문 안에서 이동 방향에 알맞게 좌표를 1씩 움직인다.

1씩 움직이며 장애물을 만나면 해당 반복문을 빠져나가고 현재 x, y좌표는 재설정하지 않는다.

만약 끝까지 장애물을 만나지 않았더라면 현재 x, y좌표를 재설정하게 된다. 

 

코드

import java.util.*;
 
public static int[] solution5(String[] park, String[] routes) {
        System.out.println("공원 산책");
        /*
         * S : 시작
         * O : 이동 가능
         * X : 장애물
         *
         * N : 위
         * S : 아래
         * E : 앞으로
         * W : 뒤로
         */

        int h = park.length, w = park[0].length();
        int x = 0, y = 0;
        String[][] parkArr = new String[h][w];

        // 1. 공원 2차원배열에 저장
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                parkArr[i][j] = park[i].toCharArray()[j] + "";
                if (parkArr[i][j].equals("S")) {
                    x = i;
                    y = j;
                }
            }
        }

        // 2. 이동
        for (String str : routes) {
            int tempX = x, tempY = y; // 현재 위치
            String move = str.split(" ")[0]; // 방향
            int count = Integer.parseInt(str.split(" ")[1]); // 이동 칸 수

            for (int i = 0; i < count; i++) {
                // 방향과 이동 칸 수 확인
                switch (move) {
                    case "N": // 위로
                        tempX--;
                        break;
                    case "S": // 아래로
                        tempX++;
                        break;
                    case "E": // 앞으로
                        tempY++;
                        break;
                    case "W": // 뒤로
                        tempY--;
                        break;
                }

                if ((tempX >= 0 && tempX < h) && (tempY >= 0 && tempY < w)) {
                    // 범위 안에 있음
                    if (parkArr[tempX][tempY].equals("X")) {
                        // 장애물 만남
                        break;
                    }

                    if (i == count - 1) {
                        x = tempX;
                        y = tempY;
                    }
                }

            }
        }

        return new int[] { x, y };
    }

 

프로그래머스 문제

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

 

프로그래머스

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

programmers.co.kr

 

 

 

반응형