문제
https://school.programmers.co.kr/learn/courses/30/lessons/172928
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
주어진 문제는 직사각형 격자로 이루어진 공원에서 로봇 강아지가 명령에 따라 이동하는 시뮬레이션을 구현하는 것입니다. 공원은 'O'로 표시된 길과 'X'로 표시된 장애물로 이루어져 있으며, 강아지는 시작 지점 'S'에서 주어진 명령을 순서대로 수행합니다. 명령 형식은 “방향 거리” 형태로 주어지며, 각 명령을 수행할 때 다음 사항을 확인합니다.
- 이동 방향이 공원을 벗어나는지 확인합니다.
- 이동 중 장애물을 만나는지 확인합니다.
위 사항 중 하나라도 해당되면 해당 명령은 무시됩니다. 공원 격자는 좌측 상단 (0,0)에서 시작해 우측 하단 (H-1, W-1)로 이루어져 있으며, 강아지는 이동 후의 최종 위치를 반환합니다.
해결 방법
- 맵 초기화: 입력된 park 배열을 2차원 문자열 배열로 변환하여 공원의 구조를 나타냅니다. 동시에 시작 지점 'S' 위치를 찾습니다.
- 명령 수행: routes 배열을 순회하며 명령을 읽고, 명령에 따라 이동을 시도합니다. 각 명령은 방향과 거리로 이루어지며, 이 방향을 dr, dc 배열로 설정해 방향에 따른 행, 열 변화를 설정했습니다.
- 이동 함수: move 함수는 입력된 방향과 거리를 따라 이동합니다. 이동 도중 범위를 벗어나거나 장애물('X')을 만나면 해당 이동을 중지하고, 다음 명령으로 넘어갑니다.
- 최종 위치 반환: 모든 명령 수행 후 강아지가 위치한 좌표를 반환합니다.
import java.util.*;
class Solution {
// 이동 방향을 나타내는 배열 (북, 남, 서, 동)
static int[] dr = {-1, 1, 0, 0}; // 행 이동
static int[] dc = {0, 0, -1, 1}; // 열 이동
static String[][] map; // 공원을 나타낼 맵
static Node cur; // 현재 강아지 위치
public int[] solution(String[] park, String[] routes) {
int[] answer = new int[2];
map = new String[park.length][park[0].length()];
// 맵 초기화 및 시작 위치 설정
for (int i = 0; i < park.length; i++) {
map[i] = park[i].split("");
for (int j = 0; j < map[i].length; j++) {
if (map[i][j].equals("S")) cur = new Node(i, j); // 시작 위치 찾기
}
}
// 명령 수행
for (int i = 0; i < routes.length; i++) {
String[] arr = routes[i].split(" ");
int distance = Integer.parseInt(arr[1]);
// 방향에 따라 이동
switch(arr[0]) {
case "N" :
move(0, distance); // 북쪽 이동
break;
case "S" :
move(1, distance); // 남쪽 이동
break;
case "W" :
move(2, distance); // 서쪽 이동
break;
case "E" :
move(3, distance); // 동쪽 이동
break;
}
}
// 최종 위치 설정
answer[0] = cur.r;
answer[1] = cur.c;
return answer;
}
// 이동 함수
public void move(int direction, int steps) {
int nr = cur.r;
int nc = cur.c;
// 방향 및 거리만큼 이동
for (int i = 0; i < steps; i++) {
nr += dr[direction];
nc += dc[direction];
// 범위 벗어나거나 장애물 발견 시 이동 중지
if (nr < 0 || nc < 0 || nr >= map.length || nc >= map[0].length || map[nr][nc].equals("X")) return;
}
// 유효한 경우 최종 위치 갱신
cur = new Node(nr, nc);
}
// 위치를 나타내는 Node 클래스
class Node {
int r, c;
public Node(int r, int c) {
this.r = r;
this.c = c;
}
}
}
'문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 단체사진 찍기 - Java (0) | 2024.11.08 |
---|---|
[프로그래머스] 빛의 경로 사이클 - Java (0) | 2024.11.07 |
[프로그래머스] 베스트앨범 - Java (0) | 2024.11.01 |
[프로그래머스] 입국심사 - Java (0) | 2024.10.29 |
[프로그래머스] 여행경로 - Java (0) | 2024.10.29 |