[프로그래머스] 방문 길이
Programmers - [Summer/Winter Coding(~2018)] 방문 길이
사용 언어 - C++
소요 시간 - 약 63분(정해둔 시간 60분에서 3분 초과)
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/49994
문제 요약
- (-5, -5) ~ (5, 5)까지의 좌표평면이 존재
- 게임 캐릭터는 (0, 0)에서 출발
- 처음 가는 길을 가는 경우, answer++
- 길이 없다면 다음 명령으로 움직임
- 결과 answer return
최종 코드
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
int solution(string dirs) {
int answer = 0;
//최대 최소 변수
int minXY = 0;
int maxXY = 10;
//이전 위치, 현재 위치
int prevX = 5, prevY = 5;
int currX = 5, currY = 5;
bool isVisited[maxXY + 1][maxXY + 1][maxXY + 1][maxXY + 1];
memset(isVisited, false, sizeof(isVisited));
for(const char& c : dirs)
{
if(c == 'U')
{
if(currY + 1 > maxXY) continue;
currY++;
}
else if(c == 'D')
{
if(currY - 1 < minXY) continue;
currY--;
}
else if(c == 'R')
{
if(currX + 1 > maxXY) continue;
currX++;
}
else if(c == 'L')
{
if(currX - 1 < minXY) continue;
currX--;
}
bool bCheck = true;
bCheck &= isVisited[currX][currY][prevX][prevY] == false;
bCheck &= isVisited[prevX][prevY][currX][currY] == false;
if(bCheck)
{
isVisited[currX][currY][prevX][prevY] = true;
isVisited[prevX][prevY][currX][currY] = true;
answer++;
}
cout << currX << currY << prevX << prevY << endl;
prevX = currX;
prevY = currY;
}
return answer;
}
트러블 슈팅
- 갔던 길 = 같은 위치&같은 방향으로 접근. but 반대쪽 위치에서 반대쪽 방향으로 오는 것 또한 같은 길로 가정했어야 함.
- 처음에는 방향을 주어 풀이를 진행. but 방향보다 이전 위치를 가져와 계산하는 것이 더 쉽다고 판단
풀이 절차
- 정점이 아닌, 간선을 체크해야 하는 문제이기 때문에, 방향이 필요하다고 생각
- (0,0) → (0,1) 과 (0,1) → (0,0)은 같은 길로 취급하는가? → 제출을 해보니 같은 길로 판단하는 걸로 결론이 내려짐
- bool 변수를 통해 갔던 길인지를 체크하고, 갔던 길이 아닌 경우에만 answer++
문제 풀이 후 소감
- 조금만 더 신중하게 생각하고 풀면 충분히 시간 안에 풀 수 있는 문제였는데, 요즘 잘 풀어왔다고 너무 기고만장해진 탓인지, 방심하는 것 같은 느낌이 든다. 정신을 좀 차려야겠다. ⭐😭