[Programmers] 방문 길이

bin1225·2023년 4월 1일
0

Algorithm

목록 보기
27/43
  • 문제

R,U,L,D 로 이루어진 문자열에 따라서 이동하는데, 한 번도 이동하지 않은 길을 지나치는 경우의 수를 세는 문제이다.

실수한 것들

  1. 역시 문제를 똑바로 안 봤다. 좌표면(10X10)을 벗어나는 경우는 명령을 무시해야하는데 그냥 다 세버렸다. 성질급한 한국인 유전자가 하필 문제 읽을 때마다 나온다.

  2. 정점을 기준으로 지나갔는지를 판별
    시작지점과 끝지점을 기록하고 둘 다 포함되는 경우는 이미 지나간 길이라고 판단했는데 이렇게 하면 오류가 생긴다.

    첫 그림판 이용.
    빨간 선과 파란 선은 다른 길이지만 정점이 동일하다.
    -> 간선을 기준으로 파악해야한다.

여기서 저번학기 알고리즘 시간에 뭔가 머리속에 박혀있는 아이디어가 떠올랐다. 간선 자체에 좌표를 부여하는 것.
좌표축에서 한 칸을 2로 잡고 그 사이를 간선의 좌표로 지정하여 지나간 간선을 체크하는 식으로 문제를 해결하였다.

다른 사람 풀이는 좀 다르던데 이해하기를 포기했다. 왜냐면 내 아이디어가 마음에 드니까.

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

int solution(string dirs) {
    int answer = 0;
    
    pair<int,int> loc = make_pair(0,0);
    set<pair<int,int>> check;

    for(char c: dirs){
        
        
        switch(c){
            case 'U':
                if(loc.second==10) continue;
                loc.second = loc.second+1; 
                if(check.find(loc)==check.end()){
                    answer++;
                    check.insert(loc);
                }
                loc.second = loc.second+1;
                break;
            case 'L':
                if(loc.first==-10) continue;
                loc.first = loc.first-1; 
                if(check.find(loc)==check.end()){
                    answer++;
                    check.insert(loc);
                }
                loc.first = loc.first-1; 
                break;
            case 'D':
                if(loc.second==-10) continue;
                loc.second = loc.second-1; 
                if(check.find(loc)==check.end()){
                    answer++;
                    check.insert(loc);
                }
                loc.second = loc.second-1; 
                break;
            case 'R':
                if(loc.first==10) continue;
                loc.first = loc.first+1; 
                if(check.find(loc)==check.end()){
                    answer++;
                    check.insert(loc);
                }
                loc.first = loc.first+1;
                break;
        }
    }
    return answer;
}

중복 코드가 많긴 하다.

0개의 댓글