반응형
문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/49994
문제
코드 및 풀이
모든것에 대해서 순차적으로 방문을 하게 되면서 겹치치 않은 것에 대해서 갯수를 카운팅 하면 되는 문제입니다.
여기서 주의 해야할 점은 오른쪽에서 왼쪽으로 가는 상황 (0,0) -> (0,-1)에서 왼쪽에서 오른쪽으로 갈때에 대해서 오른쪽에서 왼쪽으로도 왔는지에(0,-1) -> (0,0) 대해서도 체크를 해줘야 합니다.
이 부분을 처음 놓치고 해매버리면서 8번 테스트 케이스에서 계속 막히다가 잠시 생각을 해보니 깨달았습니다.
if(visited[ny][nx][direction] == false && visited[y][x][opposite] == false){
answer++;
visited[ny][nx][direction] = true;
}
가장 중요한 포인트로 ny,nx에 대해서 범위가 들어왔을때 반대방향에서 온적이 있는지에 대해서도 체크를 진행해주어야 문제가 풀리는 간단하면서도 한번 생각하지 못하면 계속 못하게 되는 문제였던것 같습니다.
/*
위아오왼 UDRL으로 한칸씩
캐릭터가 처음 걸어본 길의 길이
결국 겹치는 길이를 빼고 얼만큼 걸었는지에 대해서 처리를 하는것이다.
또한 판의 범위를 넘어가게 되면 명령어를 무시하는것
Y X
U -1 0
D 1 0
R 0 1
L 0 -1
*/
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(string dirs) {
int answer = 0;
int y = 5; int x = 5;
int ny = 0; int nx = 0;
//위 아래 오른쪽 왼쪽
int dy[4] = {-1,1,0,0};
int dx[4] = {0,0,1,-1};
bool visited[11][11][4]= {false,}; //위,아래,오른쪽,아래 기준으로 오는걸 삼음
for(int i = 0; i < dirs.length();i++){
int direction = 0;
int opposite = 0;
if(dirs[i] == 'U'){
ny = y + dy[0]; nx = x + dx[0]; direction = 0; opposite = 1;
}else if(dirs[i] == 'D'){
ny = y + dy[1]; nx = x + dx[1]; direction = 1; opposite = 0;
}else if(dirs[i] == 'R'){
ny = y + dy[2]; nx = x + dx[2]; direction = 2; opposite = 3;
}else if(dirs[i] == 'L'){
ny = y + dy[3]; nx = x + dx[3]; direction = 3; opposite = 2;
}
if(0 <= ny && ny <= 10 && 0 <= nx && nx <= 10){
if(visited[ny][nx][direction] == false && visited[y][x][opposite] == false){
answer++;
visited[ny][nx][direction] = true;
}
y = ny;
x = nx;
}
}
return answer;
}
반응형
'알고리즘 > c++ 프로그래머스' 카테고리의 다른 글
[프로그래머스 스킬트리] c++ (풀이,코드, map) (2) | 2023.05.24 |
---|---|
[프로그래머스 게임 맵 최단거리] c++ (코드,풀이, bfs) (2) | 2023.05.24 |
[프로그래머스 정수삼각형] c++ (풀이, 코드, level3) (1) | 2023.05.22 |
[프로그래머스 땅따먹기] c++ (풀이 ,코드 , 개념) (0) | 2023.05.22 |
[프로그래머스 주식가격] c++ (코드, 풀이) (0) | 2023.05.21 |
댓글