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



Programmers - [Summer/Winter Coding(~2018)] 방문 길이




사용 언어 - C++

소요 시간 - 약 63분(정해둔 시간 60분에서 3분 초과)




문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/49994




문제 요약

  1. (-5, -5) ~ (5, 5)까지의 좌표평면이 존재
  2. 게임 캐릭터는 (0, 0)에서 출발
  3. 처음 가는 길을 가는 경우, answer++
  4. 길이 없다면 다음 명령으로 움직임
  5. 결과 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;
}




트러블 슈팅

  1. 갔던 길 = 같은 위치&같은 방향으로 접근. but 반대쪽 위치에서 반대쪽 방향으로 오는 것 또한 같은 길로 가정했어야 함.
  2. 처음에는 방향을 주어 풀이를 진행. but 방향보다 이전 위치를 가져와 계산하는 것이 더 쉽다고 판단




풀이 절차

  1. 정점이 아닌, 간선을 체크해야 하는 문제이기 때문에, 방향이 필요하다고 생각
  2. (0,0) → (0,1) 과 (0,1) → (0,0)은 같은 길로 취급하는가? → 제출을 해보니 같은 길로 판단하는 걸로 결론이 내려짐
  3. bool 변수를 통해 갔던 길인지를 체크하고, 갔던 길이 아닌 경우에만 answer++




문제 풀이 후 소감

  • 조금만 더 신중하게 생각하고 풀면 충분히 시간 안에 풀 수 있는 문제였는데, 요즘 잘 풀어왔다고 너무 기고만장해진 탓인지, 방심하는 것 같은 느낌이 든다. 정신을 좀 차려야겠다. ⭐😭