본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스 방문 길이] c++ (풀이, 코드)

by 말린밴댕이_공부 2023. 5. 24.
반응형

문제링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

코드 및 풀이

모든것에 대해서 순차적으로 방문을 하게 되면서 겹치치 않은 것에 대해서 갯수를 카운팅 하면 되는 문제입니다.

 

여기서 주의 해야할 점은 오른쪽에서 왼쪽으로 가는 상황 (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;
}

 

 

반응형

댓글