R,U,L,D 로 이루어진 문자열에 따라서 이동하는데, 한 번도 이동하지 않은 길을 지나치는 경우의 수를 세는 문제이다.
역시 문제를 똑바로 안 봤다. 좌표면(10X10)을 벗어나는 경우는 명령을 무시해야하는데 그냥 다 세버렸다. 성질급한 한국인 유전자가 하필 문제 읽을 때마다 나온다.
정점을 기준으로 지나갔는지를 판별
시작지점과 끝지점을 기록하고 둘 다 포함되는 경우는 이미 지나간 길이라고 판단했는데 이렇게 하면 오류가 생긴다.
첫 그림판 이용.
빨간 선과 파란 선은 다른 길이지만 정점이 동일하다.
-> 간선을 기준으로 파악해야한다.
여기서 저번학기 알고리즘 시간에 뭔가 머리속에 박혀있는 아이디어가 떠올랐다. 간선 자체에 좌표를 부여하는 것.
좌표축에서 한 칸을 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;
}
중복 코드가 많긴 하다.