일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Java
- 프로그래머스
- 아스키코드
- LIS
- 다리 만들기
- 빅데이터
- 다이나믹프로그래밍
- 스택
- SQL
- 구현
- BufferedReader
- 알고리즘
- Stack
- 브루트포스
- oracle
- 탐색
- 배열
- 백트래킹
- Python
- DP
- 완전탐색
- BFS
- dfs
- 문자열
- 그리디
- 백준
- 시뮬레이션
- Queue
- 새벽코딩
- HashMap
- Today
- Total
새벽코딩
[프로그래머스] 공원산책 (시뮬레이션) (JAVA) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/172928
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
- ["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전 에 다음 두 가지를 먼저 확인합니다.
- 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
- 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.
공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
※ JAVA 코드(공원산책)
import java.io.*;
import java.util.*;
class Solution {
static public class Node {
int x, y;
public Node(int x, int y){
this.x = x;
this.y = y;
}
}
public int[] solution(String[] park, String[] routes) {
int[] answer = {};
answer = new int[2];
int x = park.length;
int y = park[0].length();
int parkX = x;
int parkY = y;
char[][] map = new char[x][y];
Node start = new Node(0, 0);
for(int i = 0; i < park.length; i++){
for(int j = 0; j < park[i].length(); j++){
char c = park[i].charAt(j);
map[i][j] = c;
// 시작 지점의 좌표를 담는다.
if(c == 'S'){
start = new Node(i, j);
}
}
}
int curX = start.x;
int curY = start.y;
for(int i = 0; i < routes.length; i++){
String command = routes[i];
String[] path = command.split("\\s");
int dis = Integer.parseInt(path[1]);
if("E".equals(path[0])){
int move = 0;
for(int j = 1; j <= dis; j++){
int c = curY + j;
if(c >= parkY || map[curX][c] == 'X') {
move = 0;
break;
} else {
move++;
}
}
curY += move;
} else if("W".equals(path[0])) {
int move = 0;
for(int j = 1; j <= dis; j++){
int c = curY - j;
if(c < 0 || map[curX][c] == 'X') {
move = 0;
break;
} else {
move--;
}
}
curY += move;
} else if("N".equals(path[0])) {
int move = 0;
for(int j = 1; j <= dis; j++){
int c = curX - j;
if(c < 0 || map[c][curY] == 'X') {
move = 0;
break;
} else {
move--;
}
}
curX += move;
} else if("S".equals(path[0])) {
int move = 0;
for (int j = 1; j <= dis; j++) {
int c = curX + j;
if (c >= parkX || map[c][curY] == 'X') {
move = 0;
break;
} else {
move++;
}
}
curX += move;
}
}
answer[0] = curX;
answer[1] = curY;
return answer;
}
}
※ 생각정리 (공원산책)
1. 방향을 숫자가 아닌 문자로 판별해야 하기에 Equals로 동서남북을 판별하여 좌표를 이동시켰다.
2. 각 방향을 맵 (Map<String, Integer>())에 담아서 해도 가능할거 같다.
3. 맵에 좌표이동을 하는 방식은 BFS방식과 유사했지만 큐에 담지 않고 동일 방향으로만 움직인다.
4. 이동가중치를 증가시키면서 만약, 장애물이나 맵의 범위를 벗어난다면 가중치를 0으로 초기화하고 break문으로 빠져나왔다.
-새벽코딩-
'알고리즘' 카테고리의 다른 글
[백준] [9613] GCD 합 (유클리드) (JAVA) (1) | 2023.05.19 |
---|---|
[프로그래머스] 게임 맵 최단거리 (BFS) (너비우선탐색) (JAVA) (0) | 2023.05.18 |
[프로그래머스] 최소직사각형 (완전탐색) (JAVA) (1) | 2023.05.16 |
[백준] [9372] 상근이의 여행 (MST, BFS) (JAVA) (1) | 2023.05.12 |
[백준] [1389] 케빈 베이컨의 6단계 법칙 (그래프, 플로이드-워셜) (JAVA) (2) | 2023.05.09 |