프로그래머스의 문제 풀이 과정을 공유드린다.
문제 출처

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 문제 풀이를 자주 해와서 어렵지 않았음.