반응형
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
반응형
그리드형
'문제풀이(Problem Solving)' 카테고리의 다른 글
프로그래머스, 정수 삼각형 : C++ [CPP] (0) | 2021.11.18 |
---|---|
프로그래머스, 가장 큰 정사각형 찾기 : C++ [CPP] (0) | 2021.11.18 |
프로그래머스, 스킬트리 : C++ [CPP] (0) | 2021.11.18 |
프로그래머스, 더 맵게 : C++ [CPP] (0) | 2021.11.18 |
프로그래머스, 점프와 순간 이동 : C++ [CPP] (0) | 2021.11.17 |