https://school.programmers.co.kr/learn/courses/30/lessons/172928
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
주어진 맵을 routes에 따라 이동하며 맵을 벗어나는지, 장애물을 만나는지 확인하며 진행했을 떄, 최종 위치를 출력하는 문제입니다.
초기 위치 'S'가 항상 0,0이 아니므로 시작 위치를 먼저 찾아줍니다. park 변수의 각 행에서 찾아야 하는 문자는 'S'이므로 find함수를 사용해 인덱스를 찾아줍니다.
그 이후, 모든 routes를 따라 이동하며 맵을 벗어나는지와 'X'를 만나는지 체크해줍니다. 이때, 1칸씩 이동하지 않고 한번에 dist를 이동하는 경우 중간에 만나는 'X'를 체크하지 못하므로 유의합니다. 따라서 for문을 사용해 dist만큼 1칸씩 이동해줍니다. 갈 수 없는 경로인 경우 p를 업데이트 할 수 없으므로 p_copy 변수를 사용해 복사한 후 break 여부에 따라 마지막에 p를 업데이트 해줍니다.
마지막으로 y, x 를 업데이트 해줍니다.
리뷰
dist 를 한번에 업데이트하여 중간에 만나는 'X'를 체크하지 못하는 것을 유의합니다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>> map;
struct Pose {
int x;
int y;
};
vector<int> solution(vector<string> park, vector<string> routes) {
vector<int> answer;
Pose p;
int max_x = park[0].size()-1;
int max_y = park.size()-1;
for (int i = 0; i<park.size(); i++) {
if (park[i].find('S') != string::npos) {
p.x = park[i].find('S');
p.y = i;
break;
}
}
for (auto i : routes) {
char dir = i[0];
int dist = (int)i[2] - 48;
int n_x, n_y;
bool cant = false;
Pose p_copy = p;
if (dir == 'E') {
for (int d = 0; d<dist; d++) {
n_x = p_copy.x + 1;
n_y = p_copy.y;
if (n_x < 0 || n_x > max_x || n_y < 0 || n_y > max_y ||
park[n_y][n_x] == 'X') {
cant = true;
break;
}
p_copy.x = n_x;
p_copy.y = n_y;
}
}
else if (dir == 'S') {
for (int d = 0; d<dist; d++) {
n_x = p_copy.x;
n_y = p_copy.y + 1;
if (n_x < 0 || n_x > max_x || n_y < 0 || n_y > max_y ||
park[n_y][n_x] == 'X') {
cant = true;
break;
}
p_copy.x = n_x;
p_copy.y = n_y;
}
}
else if (dir == 'W') {
for (int d = 0; d<dist; d++) {
n_x = p_copy.x - 1;
n_y = p_copy.y;
if (n_x < 0 || n_x > max_x || n_y < 0 || n_y > max_y ||
park[n_y][n_x] == 'X') {
cant = true;
break;
}
p_copy.x = n_x;
p_copy.y = n_y;
}
}
else {
for (int d = 0; d<dist; d++) {
n_x = p_copy.x;
n_y = p_copy.y - 1;
if (n_x < 0 || n_x > max_x || n_y < 0 || n_y > max_y ||
park[n_y][n_x] == 'X') {
cant = true;
break;
}
p_copy.x = n_x;
p_copy.y = n_y;
}
}
if (!cant) {
p.x = p_copy.x;
p.y = p_copy.y;
}
}
answer.push_back(p.y);
answer.push_back(p.x);
return answer;
}
'프로그래머스 > Lv.1' 카테고리의 다른 글
[C++] 프로그래머스 바탕화면 정리 (0) | 2023.10.22 |
---|---|
[C++] 프로그래머스 달리기 경주 (0) | 2023.10.21 |
[C++] 문자열 내 마음대로 정렬하기 (0) | 2023.05.18 |
[C++] 프로그래머스 옹알이 (2) (0) | 2023.03.10 |
[C++] 프로그래머스 소수 만들기 [재귀] (0) | 2023.03.05 |