프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/49994#
[나의 풀이]
⌛ 51분
def solution(dirs):
answer = 0
board = {}
for i in range(11):
for j in range(11):
for com in ['R','D','L','U']:
key = str(i)+str(j)+com
board[key] = 0
move = {'R':[0,1], 'D':[1,0], 'L':[0,-1], 'U':[-1,0]}
reverse_key = {'R':'L','D':'U','L':'R','U':'D'}
x,y = 5,5
for dir_ in dirs:
x_, y_ = move[dir_]
x_next = x+x_
y_next = y+y_
if x_next>=0 and x_next<=10 and y_next>=0 and y_next<=10:
key1 = str(x)+str(y)+dir_
x = x_next
y = y_next
key2 = str(x)+str(y)+reverse_key[dir_]
if board[key1]==0 :
board[key1] = 1
board[key2] = 1
answer += 1
return answer
11x11 좌표평면에서 입력된 명령대로 이동하며 중복되지 않은 이동 경로 갯수를 구하는 문제입니다.🐕🐕🐕
지나온 좌표가 아닌 이동 경로를 파악해야 하므로 '00R', '55D','109D'과 같이 현재 좌표 위치와 명령어로 이루어진 key들을 갖는 dict을 선언하여 이동 경로를 기억하였습니다.
입력된 명령들 대로 이동하며 경로를 기억할 때, '55L'로 이동했다면 동일 이동 경로의 다른 표현인 '54R'으로도 이동한 것으로 취급하여 해결하였습니다.
[다른 사람의 풀이1]
def solution(dirs):
s = set()
d = {'U': (0,1), 'D': (0, -1), 'R': (1, 0), 'L': (-1, 0)}
x, y = 0, 0
for i in dirs:
nx, ny = x + d[i][0], y + d[i][1]
if -5 <= nx <= 5 and -5 <= ny <= 5:
s.add((x,y,nx,ny))
s.add((nx,ny,x,y))
x, y = nx, ny
return len(s)//2
이동 경로들을 set() 집합에 넣어 간결히 풀어낸 방식입니다.🕊️🕊️🕊️
'나의 풀이'와 유사하게 동일한 이동한 경로, 이동했다고 취급할 경로
들을 각각 set()에 add하여 갯수를 셀 수 있었습니다.
[다른 사람의 풀이2]
def solution(dirs):
visit = set()
x = 0; y = 0
for d in dirs:
if d == 'U' and y < 5:
visit.add(((x, y), (x, y+1)))
y += 1
elif d == 'D' and y > -5:
visit.add(((x, y-1), (x, y)))
y -= 1
elif d == 'R' and x < 5:
visit.add(((x, y), (x+1, y)))
x += 1
elif d == 'L' and x > -5:
visit.add(((x-1, y), (x, y)))
x -= 1
return len(visit)
'다른 사람의 풀이1'과 같이 set()을 활용하되, 명령어별 이동 방식을 if-elif 문으로 처리하여 풀이를 이해하는데는 더 직관적인 코드였습니다.
감사합니다.