프로그래머스 - 방문 길이

2022. 8. 30. 13:31코딩 공부 연습

반응형

프로그래머스에 스킬 체크니 뭐니 해서 1시간 동안 2문제를 검색없이 진짜 코테 볼때처럼 푸는 게 있더라! 그게 너무 재밌어서 하루에 한번씩 해보는 중인데 이 문제를 풀게 되었다. 쉽게 풀수 있을 줄 알았는데 이상한 헛짓거리들을 하다가 좀 시간이 걸렸다.. 아직 레벨2도 통과를 못하는 모습이 참 안쓰럽다. 시간을 신경쓰면서 갈기느라 코드가 중간중간 없어도 되는것들도 껴있고 더럽다!

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int visited[11][11][11];
int visited2[11][11][11]; //3번째인자가 상하, 좌우 구분
int solution(string dirs) {
    //걍 현재 위치를 계속 업데이트하면서 벡터v페어쌍 (a,b), (b,a)를 visited 표시를 계속 해준다.
    int answer = 0;
    pair<int,int> cur;
    cur={5,5};
    int cnt = 0;
    for(int i =0; i < dirs.size(); i++)
    {
        if (dirs[i] == 'U')
        {
            if (cur.second == 10)
                continue;
            if ( visited[cur.first][cur.second][cur.second + 1] == 0) 
                cnt++;
            visited[cur.first][cur.second][cur.second + 1] = 1;
            visited[cur.first][cur.second + 1][cur.second] = 1;
            cur.second++;
        }
        else if (dirs[i] == 'D')
        {
            if (cur.second == 0)
                continue;
            if ( visited[cur.first][cur.second][cur.second - 1] == 0)
                cnt++;
            
            visited[cur.first][cur.second][cur.second - 1] = 1;
            visited[cur.first][cur.second - 1][cur.second] = 1;
            cur.second--;
        }
        else if (dirs[i] == 'R')
        {
            if (cur.first == 10)
                continue;
            if ( visited2[cur.first][cur.first + 1][cur.second] == 0)
                cnt++;
            visited2[cur.first][cur.first + 1][cur.second] = 1;
            visited2[cur.first + 1][cur.first][cur.second] = 1;
            cur.first++;
        }
        else if (dirs[i] == 'L')
        {
            if (cur.first == 0)
                continue;
            if ( visited2[cur.first][cur.first - 1][cur.second] == 0)
                cnt++;
            visited2[cur.first][cur.first - 1][cur.second] = 1;
            visited2[cur.first - 1][cur.first][cur.second] = 1;
            cur.first--;
        }
    }
    answer = cnt;
    return answer;
}

그냥 단순무식하게 테이블이 최대 크기가 10x10 으로 정해져 있기 때문에 3 -> 4 로 위로 이동했을 경우를 체크하는 배열들을 다 만들어서 visited 체크를 해주었다. 위아래, 좌우 방향 이동에 해당하는 배열들을 만들었는데, 저렇게 3차원으로 만든이상 visited를 2개로 나눌 필요도 없었다. 시간이 없었고 중간에 3차원으로 바꾸는 바람에 이해하기 어렵게 되어버린 것 같다.  만약 이동한 간선이 한번도 방문한 적 없는 경우에 카운트를 증가해 주었다.

'코딩 공부 연습' 카테고리의 다른 글

프로그래머스 짝지어 제거하기  (0) 2022.09.01
프로그래머스 - 구명 보트  (0) 2022.08.30
프로그래머스 - 위장  (0) 2022.08.26
백준 7785 - 회사에 있는 사람  (0) 2022.08.26
백준 - 5014 스타트링크  (0) 2022.08.24