프로그래머스 172928.공원 산책
프로그래머스의 문제 풀이 과정을 공유드린다.
문제 출처
1. 문제설명
- 출발점에서 경로에 따라 이동했을 때 마지막 좌표 값을 출력
2. 알고리즘 설계
- 방향을 지정해 목표치만큼 한칸씩 이동
- 이동 시 움직일 수 있는지 맵을 벗어났는지 체크
3. 로직
- 방향 지정
- 한칸씩 이동하기 위한 변수 선언
dy = 0, dx = 0; if (d == 'N') dy = -1; ELIF(d == 'E') dx = 1; ELIF(d == 'W') dx = -1; else dy = 1;
-
한칸씩 이동하면서 다음 위치가 움직일 수 있는지, 맵을 벗어나진 않았는지 체크
FOR(i, w) { ny += dy; nx += dx; if (ny < 0 || nx < 0 || ny >= n || nx >= m) return src; if (map[ny][nx] == 'X') return src; }
- 전체 코드
#include <string>
#include <vector>
#include <queue>
#include <iostream>
#define FOR(i, n) for(int i=0; i<(n); i++)
#define ELIF else if
using namespace std;
using pii = pair<int, int>;
char map[50][50];
int n, m;
pii move(pii src, string dir) {
char d = dir[0];
int w = dir[2] - '0';
int dy = 0;
int dx = 0;
if (d == 'N') dy = -1;
ELIF(d == 'E') dx = 1;
ELIF(d == 'W') dx = -1;
else dy = 1;
int ny = src.first;
int nx = src.second;
FOR(i, w) {
ny += dy;
nx += dx;
if (ny < 0 || nx < 0 || ny >= n || nx >= m)
return src;
if (map[ny][nx] == 'X')
return src;
}
return {ny, nx};
}
vector<int> solution(vector<string> park, vector<string> routes) {
pii start;
n = park.size();
m = park[0].size();
FOR(i, park.size())
FOR(j, park[i].size()) {
map[i][j] = park[i][j];
if (map[i][j] == 'S')
start = { i, j };
}
FOR(i, routes.size())
start = move(start, routes[i]);
return { start.first, start.second };
}
- 참고
- for문이랑 else if 겹쳐서 상수처리 해버림.
- 소감
- BFS의 축소판(?) 같은 문제
- 개인적으로 BFS 문제 풀이를 자주 해와서 어렵지 않았음.