문제풀이(Problem Solving)

프로그래머스, 방문 길이 : C++ [CPP]

게임이 더 좋아 2021. 11. 18. 17:43
반응형
728x170

재밌어보이길래 한 번 해봤다.

재미있긴 했다.

 

열거체를 배운김에 써먹었다

https://programmers.co.kr/learn/courses/30/lessons/49994

 


 

#맞는 풀이

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

enum direction {U,D,L,R};  //0,1,2,3

bool visited[12][12][12][12]; // -5 ~ 5 11개 숫자. 하지만 왼쪽 위가 (0,0)임.
//[시작x][시작y][도착x][도착y]

int offset = 5; // 맵크기에 비례

int solution(string dirs) {
    int answer = 0;
    int arr[2] = {0,0}; // (x,y)
    arr[0] += offset;//x
    arr[1] += offset;//y
    
    for(auto s : dirs){
        int code;
        if(s == 'U') code = U;
        if(s == 'D') code = D;
        if(s == 'L') code = L;
        if(s == 'R') code = R;
        switch(code){
            //이동할 수 있으면 방문체크하면서
            //방문 체크시 양방향으로 체크해줘야함 0011체크했으면 1100도 체크해야함 (**중요)
            //방문했으면 길이 그대로 ,방문안했으면 길이 +1
            //좌표는 업데이트해줘야함
            case U:
                if(arr[1] + 1 > 5 + offset ) break; //5보다 커지면 위로 못감.                
                //방문했으면
                if(visited[arr[0]][arr[1]][arr[0]][arr[1]+1]){
                    //좌표만 업데이트
                    arr[1] += 1;
                }else{//안했으면 방문 체크 후 좌표 업데이트 후 길이 + 1
                    visited[arr[0]][arr[1]][arr[0]][arr[1]+1] = true;
                    visited[arr[0]][arr[1]+1][arr[0]][arr[1]] = true;

                    arr[1] += 1;
                    answer++;
                }
                
                break;
            case D:
                if(arr[1] - 1 < -5 + offset) break; //-5보다 작아지먄 아래로 못감.
                //방문했으면
                if(visited[arr[0]][arr[1]][arr[0]][arr[1]-1]){
                    //좌표만 업데이트
                    arr[1] -= 1;
                }else{//안했으면 방문 체크 후 좌표 업데이트 후 길이 + 1
                    visited[arr[0]][arr[1]][arr[0]][arr[1]-1] = true;
                    visited[arr[0]][arr[1]-1][arr[0]][arr[1]] = true;
                    arr[1] -= 1;
                    answer++;
                }
                break;
            case L:
                if(arr[0] - 1 < -5 + offset) break; //5보다 커지면 오른쪽으로 못감.
                //방문했으면
                if(visited[arr[0]][arr[1]][arr[0]-1][arr[1]]){
                    //좌표만 업데이트
                    arr[0] -= 1;
                }else{//안했으면 방문 체크 후 좌표 업데이트 후 길이 + 1
                    visited[arr[0]][arr[1]][arr[0]-1][arr[1]] = true;
                    visited[arr[0]-1][arr[1]][arr[0]][arr[1]] = true;

                    arr[0] -= 1;
                    answer++;
                }
                break;
            case R:
                if(arr[0] + 1 > 5 + offset) break; //5보다 커지면 왼쪽으로 못감.
                //방문했으면
                if(visited[arr[0]][arr[1]][arr[0]+1][arr[1]]){
                    //좌표만 업데이트
                    arr[0] += 1;
                }else{//안했으면 방문 체크 후 좌표 업데이트 후 길이 + 1
                    visited[arr[0]][arr[1]][arr[0]+1][arr[1]] = true;
                    visited[arr[0]+1][arr[1]][arr[0]][arr[1]] = true;
                    arr[0] += 1;
                    answer++;
                }
                break;
        }
    }
    return answer;
}

 

결국 int형으로 알아듣지만 switch 구문 자체가 숫자로 알아먹기 때문에 바꿔주는 작업을 해줬다.

또한 양방향 체크가 핵심이다.

 

offset도 핵심인 것이

우리는 원점이 배열의 중간이 아니라 처음부터 시작한다.

 

참고

[프로그래밍언어(Programming Language)/C || C++] - C++문법/ 열거체, Enum

 

728x90
반응형
그리드형