본문 바로가기
Problem Solving

[C++] [프로그래머스] 방문 길이

by tls1107 2021. 7. 25.
728x90
반응형

 


문제 풀기 전 생각 : 

/*
문제가 참 길다...
읽기 너무 싫었다
다른 문제나 풀까 싶었지만 문제 따위에게 지지 않아!!!
하고 풀기 시작했지만 쉽지 않았다.
접근법은 먼저 이차원 배열 두개를 만든다. 
가로로 이동한 기록을 남기는 배열 하나와
세로로 이동한 기록을 남기는 배열 하나다.
입력받은 문자에 따라 x좌표와 y좌표를 이동시키며 기록을 남긴다.
자세한 설명은 코드가 할거다.
*/

#include <iostream>
using namespace std;

int solution(string dirs) {
    int answer = 0;
    int garo[12][12]={0,};
    int sero[12][12]={0,};
    int x=5,y=5;
    for(int i=0 ; i<dirs.length() ; i++){
        if(dirs[i] == 'U'){
            if(x > 9) continue;
            sero[x][y] = 1;
            x++;
        }
        else if(dirs[i] == 'D'){
            if(x == 0) continue;
            x--;
            sero[x][y] = 1;
        }
        else if(dirs[i] == 'R'){
            if(y >= 10) continue;
            garo[x][y] = 1;
            y++;
        }
        else if(dirs[i] == 'L'){
            if(y == 0) continue;
            y--;
            garo[x][y] = 1;
        }
    }
    for(int i=0 ; i<12 ; i++){
        for(int j=0 ; j<11 ; j++){
            if(sero[i][j] == 1) answer++;
            if(garo[i][j] == 1) answer++;
        }
    }  
    return answer;
}

풀 때 어려웠던 점 또는 느낀점 :

접근법 자체는 금방 생각해냈지만 

구현할때 여러가지 오류들을 굉장히 많이 만났다.

알 수 없는 오류부터 시작해 인덱싱을 잘못 했다던지 

하는 실수들을 고쳐나가다 보니 

문제가 풀리게 되었다.

담부턴 그냥 문제한테 지는것도 나쁘지 않을것 같기도 하다.

라고 할뻔.


개선방안 :

#include <string>
#include <set>
using namespace std;
int toIdx(char ch){
    switch(ch){
        case 'R': return 0;
        case 'L': return 1;
        case 'U': return 2;
        case 'D': return 3;
    }
}
int solution(string dirs) {
    char ch;
    int answer = 0,i, x=0,y=0,ty,tx,dy[]={0,0,1,-1},dx[]={1,-1,0,0},idx,a,b;
    set<pair<int,int>> ans;
    for(i=0;i<dirs.length();i++) {
        ch = dirs[i];
        idx = toIdx(ch);
        tx = x + dx[idx], ty = y + dy[idx];
        if(!(-5 <= ty && ty <= 5 && -5 <= tx && tx <= 5)) continue;
        a = x*10000+y;
        x = tx, y = ty;
        b = x*10000+y;
        if(ans.find({a,b}) == ans.end() && ans.find({b,a}) == ans.end())
            ans.insert({a,b});
    }
    return answer = (int)ans.size();
}

사실 위의 코드처럼 세트 컨테이너를 쓰는게 

출제자의 의도일수도 있다고 생각한다.

나도 세트 컨테이너 풀려고 했지만 

세트를 사용해본 경험이 적어서 차라리 머리속에 떠오른 방법을 

써보자!! 로 풀었는데 위의 코드가 더 깔끔한것 같다.

728x90
반응형

댓글