1 분 소요

Question

Q Q2 Q3


Solution

  • 좌표평면의 최대 크기는 5기 때문에 5를 원점으로 두고 음수와 양수를 표현한다.
  • 원점으로 부터 문자에 따라 1씩 이동한다.
  • 선에 대한 좌표 배열을 만든다. (좌표에 대한 방문처리를 하면 돌아오는 경우에 의해 오답이 된다.)
  • 선은 양방향으로 출발 지점과 도착지점 두 가지 경우에 대해 방문처리를 해야한다.

Cord

#include <string>
#include <unordered_map>

#define MAX 11
#define ZERO 5

using namespace std;

bool visited[10101010];  // 선에 대한 방문 (출발x,y + 도착x,y)
        
int solution(string dirs) 
{
    int answer = 0;
    
    pair<int, int> coord = { ZERO, ZERO };    // x,y 좌표 (500,500 원점)
    // 원점으로부터 이동
    // 선에 대한 방문 처리 출발과 도착지간의 양방향 방문 처리
    for (int i = 0; i < dirs.size(); ++i)
    {   
        // 출발 지점 (sum 정방향, reverse 역방향)
        int sum = coord.first * 1000000 + coord.second * 10000; 
        int reverse = coord.first * 100 + coord.second;
        
        if (dirs[i] == 'U' && coord.second < ZERO*2) { coord.second += 1; }
        else if (dirs[i] == 'D' && coord.second > 0) { coord.second -= 1; }
        else if (dirs[i] == 'R' && coord.first < ZERO*2) { coord.first += 1; }
        else if (dirs[i] == 'L' && coord.first > 0) { coord.first -= 1; }
        else { continue; }
        
        // 도착 지점
        sum += coord.first * 100 + coord.second;
        reverse += coord.first * 1000000 + coord.second * 10000;
        
        if (visited[sum] && visited[reverse]) { continue; }
        
        visited[sum] = true;
        visited[reverse] = true;
        ++answer;
    }
    
    return answer;
}

Result

Result