프로그래머스/lv2/49994. 방문 길이

SITY·2023년 11월 17일
0

Cpp_Algorithm

목록 보기
42/43

업로드중..

#include <string>
#include <string.h>
#include <map>

#define ROW 6
#define COL 6

using namespace std;

typedef struct {
    int x, y;
} coor;

int solution(string dirs) {
    int answer = 0;
    pair<int, int> s = {0, 0};

    map<pair<pair<int, int>, pair<int, int>>, int> donePath;
    map<char, int> map = {{'U', 0}, {'D', 1}, {'L', 2}, {'R', 3}};
    coor mov[4] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    for (const auto& route : dirs) {
        char dir = map[route];
        coor next = {s.first + mov[dir].x, s.second + mov[dir].y};
        if ((next.x < -5 || ROW <= next.x || next.y < -5 || COL <= next.y)) {
            continue;
        }
        if (!donePath[{{s.first, s.second}, {next.x, next.y}}]) {
            answer++;
            donePath[{{s.first, s.second}, {next.x, next.y}}]++;
            donePath[{{next.x, next.y}, {s.first, s.second}}]++;
        }
        s = {next.x, next.y};
    }
    
    return answer;
}

10X10 좌표평면에서 지나간 길이 몇개인지 찾는 문제다.
시작점 0,0에서 시작하고, U D L R 4가지 방향을 map과 mov로 정의한 후, 좌표평면 밖으로 나가지 않는다면 체크한다.
여기서 주의해야 할 점은 donePath에 지나온 길을 기록할 때 양방향으로 기록해야 한다는 점이다.
한 방향만 기록한다면 그 길을 다시 돌아올 때는 새로운 길로 인식하기 때문이다.
그리고 continue에서 넘어가지 않았다면 s에 다음 위치를 기록한 next를 할당하여 현재 위치를 최신화한다.

profile
·ᴗ·

0개의 댓글