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

 

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

 

programmers.co.kr

문제 설명
U: 위쪽으로 한 칸 가기
D: 아래쪽으로 한 칸 가기
R: 오른쪽으로 한 칸 가기
L: 왼쪽으로 한 칸 가기
위의 조건에 따라서 간선을 움직이며 총 방문 길이를 구하는 문제.
지하철역으로 따지면 지하철역을 방문했냐는 것을 묻는게 아닌 총 역에서 역을 간 횟수(길이)를 구하는 문제
해당 숫자들이 움직인 거리이며
만약 노드로 체크를 했다면 (0,1)좌표에 방문을 했다고 표시를 한다.
해당 8,9는 이미 왔던 곳이기 때문에 방문길이 플러스 하지 않는다.
조건
1. 방문 했던 노드 간선을 다시 간다면 방문 길이에 포함 되지 않는다.
2. x(-5.5) y(-5,5) 범위 내에서만 움직일 수 있다.
문제 풀이
당연히 실수로 각 노드를 visit배열로 처리해서 풀었음..ㅠ (리뷰를 보니 다 똑같이 실수를 했음)
1. 방문 간선을 체크한다.(4차원 배열로 처리)
2. 방문가능한 노드 검사 (x,y 좌표 -> 0미만 11초과 X)
*-5->0으로 0,0가 맨왼쪽이라는 가정하에 풀었음) 따라서 시작점은 5,5 

방문 간선 체크 방법(사차원 배열처리)

map[시작x좌표][시작y좌표][도착x좌표][도착y좌표] = 1
map[도착x좌표][도착y좌표][시작x좌표][시작y좌표] = 1
코드
#include <string>
#include <vector>
using namespace std;

bool map[11][11][11][11] = {false,};
int solution(string dirs) {
    int answer = 0;
    int curX = 5;
    int curY = 5;
    for(int i =0 ; i < dirs.size(); i++){
        char dir = dirs[i];
        if(dir == 'U') {
            if(curY+1 < 11) {
                if(map[curX][curY][curX][curY+1] != 1) {
                    // 간선의 방문여부를 체크해야 하기 때문에 양방향 다 방문으로 체크
                    map[curX][curY][curX][curY+1] = 1;
                    map[curX][curY+1][curX][curY] = 1;
                    answer++;
                }
                curY++;
            }
        }

        else if(dir == 'D') {
            if(curY-1 >= 0) {
                if(map[curX][curY][curX][curY-1] != 1) {
                    map[curX][curY][curX][curY-1] = 1;
                    map[curX][curY-1][curX][curY] = 1;
                    answer++;
                }
                curY--;
            }
        }

        else if(dir == 'L') {
            if(curX-1 >= 0) {
                if(map[curX][curY][curX-1][curY] != 1) {
                    map[curX][curY][curX-1][curY] = 1;
                    map[curX-1][curY][curX][curY] = 1;
                    answer++;
                }
                curX--;
            }
        }

        else if(dir == 'R') {
            if(curX+1 < 11) {
                if(map[curX][curY][curX+1][curY] != 1) {
                    map[curX][curY][curX+1][curY] = 1;
                    map[curX+1][curY][curX][curY] = 1;
                    answer++;
                }
                curX++;
            }
        }
    }
    return answer;
}

+ Recent posts