본문 바로가기

Algorithm/Implementation

(C++) - 프로그래머스(Summer/Winter Coding(~2018)) : 방문길이

반응형

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

 

코딩테스트 연습 - 방문 길이

 

programmers.co.kr

단순 구현문제였습니다.

 

풀이방법

 1. 현재 위치에서 이동시에 좌표평면 바깥으로 넘어가지 않는다면 걸어갈 수 있는지 판단할 수 있습니다.

 2. 넘어가지 않는다면 명령어를 시행한 후의 다음위치 X,Y를 nextX, nextY변수에 저장해줍니다.

 3. 다음 각자 가는 방향에 따라 판단해줍니다.

 

    3-1. 'U'인경우

    현재위치에서 올라가는 방향이 이미 간 길이 아니라면 새로운 길이므로 answer++; 그리고 다음위치에서 내려가는 방향 또한 같은 길이기 때문에 갱신해주어야합니다.

 

    3-2. 'D'인경우

    현재위치에서 내려가는 방향이 이미 간 길이 아니라면 새로운 길이므로 answer++; 그리고 다음위치에서 올라가는 방향 또한 같은 길이기 때문에 갱신해주어야합니다.

 

    3-3. 'L'인 경우

    현재위치에서 왼쪽으로 가는 방향이 이미 간 길이 아니라면 새로운 길이므로 answer++; 그리고 다음위치에서 오른쪽으로 가는 방향 또한 같은 길이기 때문에 갱신(체크)해주어야합니다.

 

    3-4. 'R'인 경우

    현재위치에서 오른쪽으로 가는 방향이 이미 간 길이 아니라면 새로운 길이므로 answer++; 그리고 다음위치에서 왼쪽으로 가는 방향 또한 같은 길이기 때문에 갱신(체크)해주어야합니다.

 

 

Code

#include <bits/stdc++.h>

using namespace std;

int solution(string dirs) {
    int answer = 0;
    //상,하,좌,우
    int ck[11][11][4];
    memset(ck,0,sizeof(ck));
    int curX = 0,curY = 0, nextX = 0, nextY = 0;

    for(int i = 0; i < dirs.size(); i++){
        if(dirs[i] == 'U'){
            if(-5 <= curY + 1 && curY + 1 <= 5){
                nextY = curY + 1;
                if(!ck[curY+5][curX+5][0]){
                    ck[curY+5][curX+5][0] = 1;
                    ck[nextY+5][nextX+5][1] = 1;
                    answer++;
                }

            }
        }
        else if(dirs[i] == 'D'){
            if(-5 <= curY - 1 && curY - 1 <= 5){
                nextY = curY - 1;
                if(!ck[curY+5][curX+5][1]){
                    ck[curY+5][curX+5][1] = 1;
                    ck[nextY+5][nextX+5][0] = 1;
                    answer++;
                }

            }
        }

        else if(dirs[i] == 'L'){
            if(-5 <= curX - 1 && curX - 1 <= 5){
                nextX = curX - 1;
                if(!ck[curY+5][curX+5][2]){
                    ck[curY+5][curX+5][2] = 1;
                    ck[nextY+5][nextX+5][3] = 1;
                    answer++;
                }
            }
        }
        else{
            if(-5 <= curX + 1 && curX + 1 <= 5){
                nextX = curX + 1;
                if(!ck[curY+5][curX+5][3]){
                    ck[curY+5][curX+5][3] = 1;
                    ck[nextY+5][nextX+5][2] = 1;
                    answer++;
                }
            }
        }
        curX = nextX;
        curY = nextY;
    }
    return answer;
}