본문 바로가기

알고리즘/프로그래머스

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

반응형

방문 길이(https://programmers.co.kr/learn/courses/30/lessons/49994)


1. 이해하기

  • 게임 캐릭터를 4가지 명령어를 통해서 움직인다.
    • U: 위쪽으로 한 칸
    • D: 아래쪽으로 한 칸
    • R: 오른쪽으로 한 칸
    • L: 왼쪽으로 한 칸
  • 캐릭터를 0,0에서 시작하고 경계가 주어진다. 경계에서 벗어난 움직임을 할 경우 명령어를 무시한다.
  • 캐릭터가 처음 걸어본 길의 길이를 구한다. 거쳐간 길을 갈 경우 길이에 포함시키지 않는다.

2. 구현하기

  • 경계에서 벗어난 움직임을 할 경우에는 명령어를 무시한다.

    • 맨 왼쪽 아래를 0,0으로 설정하고 맨 오른쪽 위를 10,10으로 잡는다.
    • Python
    def out_bound(x,y):
        return x < 0 or x > 10 or y < 0 or y > 10
    • C++
    bool out_bound(int x, int y) {
        return x < 0 or x > 10 or y < 0 or y > 10;
    }
  • 각 명령어에 따라서 지나온 길을 체크한다. 만약 이미 체크된 길을 지나가는 것이라면 answer의 값을 증가시키지 않는다. 그렇지 않다면 지나왔다고 체크해준 후 answer를 하나 증가시킨다.

    • Python
    def solution(dirs):
        answer = 0
        x,y = 5,5
        check = [[[False for h in range(4)] for c in range(11)] for r in range(11)]
        for s in dirs:
            if s == 'U':
                nx,ny = x-1,y
                if out_bound(nx,ny): continue
                if check[x][y][0] == False:
                    check[x][y][0] = True
                    check[nx][ny][1] = True
                    answer+=1
                x,y = nx,ny
            elif s == 'D':
                nx,ny = x+1,y
                if out_bound(nx,ny): continue
                if check[x][y][1] == False:
                    check[x][y][1] = True
                    check[nx][ny][0] = True
                    answer+=1
                x,y = nx,ny
            elif s == 'R':
                nx,ny = x,y+1
                if out_bound(nx,ny): continue
                if check[x][y][2] == False:
                    check[x][y][2] = True
                    check[nx][ny][3] = True
                    answer+=1
                x,y = nx,ny
            elif s == 'L':
                nx,ny = x,y-1
                if out_bound(nx,ny): continue
                if check[x][y][3] == False:
                    check[x][y][3] = True
                    check[nx][ny][2] = True
                    answer+=1
                x,y = nx,ny
        return answer
    • C++
    int solution(string dirs)
    {
        int answer = 0;
        int x = 5, y = 5;
        for(int i = 0; i < dirs.size(); i++) {
            if(dirs[i] == 'U') {
                int nx = x-1, ny = y;
                if(out_bound(nx,ny)) continue;
                if(!check[x][y][0]) {
                    check[x][y][0] = check[nx][ny][1] = true;
                    answer++;
                }
                x = nx; y = ny;
            } else if(dirs[i] == 'D') {
                int nx = x+1, ny = y;
                if(out_bound(nx,ny)) continue;
                if(!check[x][y][1]) {
                    check[x][y][1] = check[nx][ny][0] = true;
                    answer++;
                }
                x = nx; y = ny;
            } else if(dirs[i] == 'R') {
                int nx = x, ny = y+1;
                if(out_bound(nx,ny)) continue;
                if(!check[x][y][2]) {
                    check[x][y][2] = check[nx][ny][3] = true;
                    answer++;
                }
                x = nx; y = ny;
            } else if(dirs[i] == 'L') {
                int nx = x, ny = y-1;
                if(out_bound(nx,ny)) continue;
                if(!check[x][y][3]) {
                    check[x][y][3] = check[nx][ny][2] = true;
                    answer++;
                }
                x = nx; y = ny;
            }
        }
        return answer;
    }

3. 전체코드

  • Python

    def out_bound(x,y):
        return x < 0 or x > 10 or y < 0 or y > 10
    
    def solution(dirs):
        answer = 0
        x,y = 5,5
        check = [[[False for h in range(4)] for c in range(11)] for r in range(11)]
        for s in dirs:
            if s == 'U':
                nx,ny = x-1,y
                if out_bound(nx,ny): continue
                if check[x][y][0] == False:
                    check[x][y][0] = True
                    check[nx][ny][1] = True
                    answer+=1
                x,y = nx,ny
            elif s == 'D':
                nx,ny = x+1,y
                if out_bound(nx,ny): continue
                if check[x][y][1] == False:
                    check[x][y][1] = True
                    check[nx][ny][0] = True
                    answer+=1
                x,y = nx,ny
            elif s == 'R':
                nx,ny = x,y+1
                if out_bound(nx,ny): continue
                if check[x][y][2] == False:
                    check[x][y][2] = True
                    check[nx][ny][3] = True
                    answer+=1
                x,y = nx,ny
            elif s == 'L':
                nx,ny = x,y-1
                if out_bound(nx,ny): continue
                if check[x][y][3] == False:
                    check[x][y][3] = True
                    check[nx][ny][2] = True
                    answer+=1
                x,y = nx,ny
        return answer
  • C++

    #include <string>
    using namespace std;
    
    bool check[11][11][4];
    
    bool out_bound(int x, int y) {
        return x < 0 or x > 10 or y < 0 or y > 10;
    }
    
    int solution(string dirs)
    {
        int answer = 0;
        int x = 5, y = 5;
        for(int i = 0; i < dirs.size(); i++) {
            if(dirs[i] == 'U') {
                int nx = x-1, ny = y;
                if(out_bound(nx,ny)) continue;
                if(!check[x][y][0]) {
                    check[x][y][0] = check[nx][ny][1] = true;
                    answer++;
                }
                x = nx; y = ny;
            } else if(dirs[i] == 'D') {
                int nx = x+1, ny = y;
                if(out_bound(nx,ny)) continue;
                if(!check[x][y][1]) {
                    check[x][y][1] = check[nx][ny][0] = true;
                    answer++;
                }
                x = nx; y = ny;
            } else if(dirs[i] == 'R') {
                int nx = x, ny = y+1;
                if(out_bound(nx,ny)) continue;
                if(!check[x][y][2]) {
                    check[x][y][2] = check[nx][ny][3] = true;
                    answer++;
                }
                x = nx; y = ny;
            } else if(dirs[i] == 'L') {
                int nx = x, ny = y-1;
                if(out_bound(nx,ny)) continue;
                if(!check[x][y][3]) {
                    check[x][y][3] = check[nx][ny][2] = true;
                    answer++;
                }
                x = nx; y = ny;
            }
        }
        return answer;
    }

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 배달  (0) 2019.12.02
[프로그래머스] 야근 지수  (0) 2019.11.29
[프로그래머스] 등굣길  (0) 2019.11.23
[프로그래머스] 여행경로  (0) 2019.11.20
[프로그래머스] 예산  (0) 2019.11.18