문제 풀이/문제 풀이(프로그래머스)

Summer/Winter Coding(~2018) > 방문 길이

풀뿌리 2025. 1. 17. 21:07

문제 위치 : https://school.programmers.co.kr/learn/courses/30/lessons/49994

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

이 코드는 좌표평면에서 주어진 명령에 따라 캐릭터를 이동시키며, 처음 방문한 길의 개수를 계산하는 문제를 해결한다. 캐릭터의 현재 위치는 cur_pos 배열에 저장하며, 초기값은 (0, 0)이다. 방문한 길은 set 자료구조를 사용해 기록하며, 각 길은 시작점과 끝점을 포함하는 쌍으로 저장한다. dx와 dy 배열은 R, L, U, D 명령어에 따라 x축과 y축으로 이동하는 방향을 정의한다. dir 배열은 명령어와 방향 인덱스를 매칭하는 용도로 사용한다.

 

dirs 문자열에 포함된 명령어를 하나씩 순회하며 처리한다. 각 명령어에 대해 dir 배열을 참조하여 명령어에 대응하는 방향 인덱스를 구한다. 방향 인덱스를 기반으로 dx와 dy 값을 더해 이동 후의 새로운 좌표를 계산한다. 이동 후의 좌표가 좌표평면의 경계인 -5 이상 5 이하를 벗어나는 경우에는 해당 명령을 무시한다.

 

유효한 이동일 경우, 이동 전의 좌표와 이동 후의 좌표를 각각 start와 end로 저장한다. 두 좌표를 min과 max로 정렬하여 양방향 길을 동일하게 처리한 후 set에 저장한다. 이후 cur_pos를 새로운 좌표로 갱신한다. dirs 문자열의 모든 명령어 처리가 끝난 후 set에 저장된 길의 개수를 반환한다.

#include <string>
#include <algorithm>
#include <set>

using namespace std;

int solution(string dirs) {
    int cur_pos[2] = {0, 0}; // 현재 위치
    set<pair<pair<int, int>, pair<int, int>>> visited; // 방문한 길
    int dx[4] = {0, 0, 1, -1}; // R, L, U, D 순서
    int dy[4] = {1, -1, 0, 0};
    char dir[4] = {'R', 'L', 'U', 'D'};

    for (char command : dirs) {
        int dir_index = -1;
        for (int i = 0; i < 4; i++) {
            if (dir[i] == command) {
                dir_index = i;
                break;
            }
        }

        // 새로운 좌표 계산
        int new_x = cur_pos[0] + dx[dir_index];
        int new_y = cur_pos[1] + dy[dir_index];

        // 경계 확인
        if (new_x < -5 || new_x > 5 || new_y < -5 || new_y > 5) continue;

        // 길 기록
        pair<int, int> start = {cur_pos[0], cur_pos[1]};
        pair<int, int> end = {new_x, new_y};

        visited.insert({min(start, end), max(start, end)}); // 양방향 고려

        // 위치 갱신
        cur_pos[0] = new_x;
        cur_pos[1] = new_y;
    }

    return visited.size();
}