[프로그래머스/C++] 방문길이

1 분 소요

1.문제 링크

방문길이



2. 풀이 전 계획과 생각

  • set 자료형 사용하기



3. 풀이

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


int solution(string dirs) {
    int cx=0, cy=0;
    set<pair<pair<int,int>,pair<int,int>>> s;

    for(int i=0;i<dirs.size();i++){
        if(dirs[i]=='U'){
            if(cy==5) continue;
            s.insert({ {cx,cy},{cx,cy+1} });
            s.insert({ {cx,cy+1},{cx,cy} }); // 같은 경로 취급
            cy += 1;
        }
        else if(dirs[i]=='D'){
            if(cy==-5) continue;
            s.insert({ {cx,cy},{cx,cy-1} });
            s.insert({ {cx,cy-1},{cx,cy} }); // 같은 경로 취급
            cy -= 1;
        }
        else if(dirs[i]=='R'){
            if(cx==5) continue;
            s.insert({ {cx,cy},{cx+1,cy} });
            s.insert({ {cx+1,cy},{cx,cy} }); // 같은 경로 취급
            cx += 1;
        }
        else if(dirs[i]=='L'){
            if(cx==-5) continue;
            s.insert({ {cx,cy},{cx-1,cy} });
            s.insert({ {cx-1,cy},{cx,cy} }); // 같은 경로 취급
            cx -= 1;
        }
    }

    int answer = s.size()/2;
    return answer;
}

명령어가 U인경우… 현재 y좌표가 5라면 건너뛰기

명령어가 D인경우… 현재 y좌표가 -5라면 건너뛰기

명령어가 R인경우… 현재 x좌표가 5라면 건너뛰기

명렁어가 L인경우… 현재 x좌표가 -5라면 건너뛰기

각 명령어에 맞게 새로운 좌표를 set 자료형에 insert해준다. 시작좌표, 도착좌표를 삽입한다. 이때 도착좌표, 시작좌표 순서로 한번더 삽입한다.

마지막에 set 크기를 2로 나누어 반환한다.



4. 풀이하면서 고민했던 점

  • 테스트8 부터 통과되지 않음. 알고보니 예로들어 “UDU”의 경우 갔다가 다시 되돌아 오는 경우는 1로 취급해야 했다. 그래서 set 자료형에 insert할 때 (시작좌표, 도착좌표), (도착좌표, 시작좌표)로 2번 삽입해서 해결했다.



5. 문제를 풀고 알게된 개념 및 소감

  • set자료형에 pair 사용이 가능하다는 것을 알게됨.