문제

설명

  • 좌표평면의 경계가 (5,5), (-5,5), (5,-5), (-5,-5)로 이루어진 좌표평면에서
  • (0,0)에서 부터 시작하여 주어진 방향으로 이동하였을때
  • 중복되지 않은 이동 거리를 구하는 문제
  • 단, 좌표평면을 벗어나는 이동일 경우 무시한다.

코드

#include <string>
#include <set>
#include <iostream>
using namespace std;

#define minDir -5
#define maxDir 5

int solution(string dirs) {
    int answer = 0;
    set<pair<pair<int,int>,pair<int,int>>> s; // 현재 좌표와 이전 좌표를 저장
    int x = 0;      // 현재 좌표
    int y = 0;      // ``
    int beforeX;    // 이전 좌표
    int beforeY;    // ``
    for (char direction : dirs) {
        // 이동 전의 값
        beforeX = x;
        beforeY = y;
        // 좌표평면을 벗어나지 않고, 각 방향으로 이동
        if (direction == 'U') {
            if (y < maxDir) {
                y += 1;
            }
        }
        if (direction == 'D') {
            if (y > minDir) {
                y -= 1;
            }
        }
        if (direction == 'L') {
            if (x > minDir) {
                x -= 1;
            }
        }
        if (direction == 'R') {
            if (x < maxDir) {
                x += 1;
            }
        }
        // 좌표평면 내에서 이동했을 경우
        if (beforeX != x || beforeY != y) {
            // 이동 경로가 처음일 경우 현재 좌표와 이전 좌표 저장
            // (1,2)에서 (1,1)로 가는 경우와 (1,1)에서 (1,2)로 가는 경우 같은 이동으로 처리
            if (s.find(make_pair(make_pair(x, y), make_pair(beforeX, beforeY))) == s.end() &&
                s.find(make_pair(make_pair(beforeX, beforeY), make_pair(x, y))) == s.end()
               ) {
                s.insert(make_pair(make_pair(x, y), make_pair(beforeX, beforeY)));
            }
        }
    }
    
    answer = s.size();
    return answer;
}

댓글을 남기시려면 Github 로그인을 해주세요