Summer/Winter Coding(~2018) > 방문 길이
문제 위치 : 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();
}