문제 링크
풀이 방법
- 시작 지점을 찾는다.
- op,n을 찾는다
- Moving 함수의 Switch문으로 동서남북의 케이스를 나눈다.
- park를 for문으로 n번만큼 순회하면서 범위를 벗어나거나 장애물인 경우를 찾는다.
- 만약 찾았다면 바로 return하여 pos값을 유지한다.
- 범위 안이고 찾지 못했다면 pos의 값을 수정한다.
코드
void Moving(pair<int, int>& pos, const vector<string>& park, char op, int n)
{
auto h = park.size();
auto w = park[0].size();
switch (op)
{
case 'N':
for (int i = 1; i <= n; i++)
{
if (pos.first - i < 0 || park[pos.first - i][pos.second] == 'X')
return;
}
pos.first -= n;
break;
case 'S':
for (int i = 1; i <= n; i++)
{
if (pos.first + i >= h || park[pos.first + i][pos.second] == 'X')
return;
}
pos.first += n;
break;
case 'W':
for (int i = 1; i <= n; i++)
{
if (pos.second - i <0 || park[pos.first][pos.second-i] == 'X')
return;
}
pos.second -= n;
break;
case 'E':
for (int i = 1; i <= n; i++)
{
if (pos.second + i >=w || park[pos.first][pos.second + i] == 'X')
return;
}
pos.second += n;
break;
}
}
vector<int> solution(vector<string> park, vector<string> routes) {
vector<int> answer;
auto h = park.size();
auto w = park[0].size();
pair<int, int> pos;
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
if (park[i][j] == 'S')
{
pos = { i,j };
break;
}
}
}
for (const auto& route : routes)
{
char op = route.front();
int n = route.back() - '0';
Moving(pos, park, op, n);
}
answer.push_back(pos.first);
answer.push_back(pos.second);
return answer;
}