반응형
방문 길이(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 |