프로그래머스/lv1/172928. 공원 산책

SITY·2023년 9월 28일
0

Cpp_Algorithm

목록 보기
17/43

#include <string>
#include <vector>
#include <map>
using namespace std;

typedef struct {
    int x, y;
} coor;

vector<int> solution(vector<string> p, vector<string> r) {
    pair<int, int> start;

    int row = p.size();
    int col = p[0].size();

    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++) 
            if (p[i][j] == 'S')
                start = make_pair(i,j);

    map<char, int> map = {{'N', 0}, {'S', 1}, {'W', 2}, {'E', 3}};
    coor movable[4] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    for (string route : r) {
        char dir = map[route[0]];
        int dis = route[2] - '0';

        int nx = start.first;
        int ny = start.second;

        while (dis--) {
            nx += movable[dir].x;
            ny += movable[dir].y;

            if ((nx < 0 || row <= nx || ny < 0 || col <= ny) || p[nx][ny] == 'X')
                break;
        }
        if (dis < 0) start = make_pair(nx, ny);
    }

    return {start.first, start.second};
}

나동빈님의 알고리즘 유튜브에서 구조체 배열을 이용한 좌표값을 구해 체스 문제를 푸는 방법을 다시 기억해내서 풀어보았다. 미로 좌표 문제는 몇 문제 풀어 본 적이 없어서 이리저리 찾아보며 하느라 조금 오래 걸리긴 했는데 아주 오랜만에 좌표를 이용한 문제를 다시 상기시키는 문제였다.

map에 각 방향에 대한 번호를 저장, 그리고 movable이라는 구조체 배열에 각 번호에 어느 좌표로 이동할지를 저장한다.
그리고 r의 크기만큼 반복문을 돌며 각 좌표를 nx, ny에 저장하고, dis만큼 이동한 거리가 유효한지를 확인하면서 장애물 'X'가 있을 거나 벽에 막히면 break로 종료, 반복문을 나온 뒤 dis의 크기를 검사하고 0보다 작다면 정상적으로 루프를 종료했다는 의미이기 때문에 좌표값을 갱신해준다. 그리고 마지막으로 남은 좌표값을 vector에 바로 할당해서 return한다.

profile
·ᴗ·

0개의 댓글