https://programmers.co.kr/learn/courses/30/lessons/49994
문제 설명
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;
}