문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/172928
소스 코드
def solution(park, routes):
for row in range(len(park)):
for col in range(len(park[0])):
if park[row][col] == 'S': # 시작점 찾기
cur_x,cur_y = row,col
break
directions = {'E':(0,1), 'S':(1,0), 'W':(0,-1), 'N':(-1,0)} # 방향 벡터
for route in routes:
direction,count = route.split() # 방향, 이동 횟수
dx,dy = directions[direction][0], directions[direction][1]
flag = True
for i in range(1,int(count)+1):
tx,ty = cur_x+dx*i, cur_y+dy*i
if 0 <= tx < len(park) and 0 <= ty < len(park[0]):
pass
else:
flag = False # 범위 벗어나는 경우
break
if park[tx][ty] == 'X': # 벽을 만나는 경우
flag = False
break
else:
pass
if flag: # 범위 내에 벽을 만나지 않은 경우에만 업데이트
cur_x,cur_y = tx,ty
return [cur_x,cur_y]
해설
- 단순 구현 유형
구현
내용 자체가 특별히 어렵거나 복잡한 것은 없는 단순한 구현 유형이었습니다.
좀 더 정교하게 코드를 짠다면 조건을 만족하는지 확인하는 코드를 보다 효율적으로 작성할 고민을 했을 것 같은데 좀 귀찮아서..
굉장히 거칠고 단순하게 코드를 작성했습니다.
1. 시작점 찾기
그냥 park 리스트에 S를 찾아 그 행과 열 위치를 기록해둡니다.
for row in range(len(park)):
for col in range(len(park[0])):
if park[row][col] == 'S': # 시작점 찾기
cur_x,cur_y = row,col
break
2. 방향, 횟수 세팅
동서남북 방향에 따라 행,열을 움직여야 하기 때문에 이를 딕셔너리에서 받아옵니다.
몇 번을 움직여야 하는지도 그냥 정수로 받으면 좋았을 것 같습니다.
directions = {'E':(0,1), 'S':(1,0), 'W':(0,-1), 'N':(-1,0)} # 방향 벡터
for route in routes:
direction,count = route.split() # 방향, 이동 횟수
dx,dy = directions[direction][0], directions[direction][1]
3. 조건을 만족했는지 확인하는 지표, flag
저는 조건문 한 번에 내용을 다 확인하기 어려운 경우 flag를 사용하는 걸 좋아합니다.
조건이 만족되지 않은 경우 flag를 False로 바꾸는 것이죠.
사실 위 코드에서 첫 번째 조건은 '범위'입니다.
이동을 하더라도 격자판 위에 존재하는지 확인하는 것이죠.
두 번째 조건은 '장애물'입니다.
이동한 위치에 장애물이 없어야 합니다.
이 두 조건 중 하나라도 만족이 되지 않은 경우 flag는 False로 바뀌고 for문은 종료됩니다.
for문으로 모든 요소를 따져보았을 때도 flag가 True로 유지된 경우에만 현재 위치를 업데이트 합니다.
즉, 범위를 벗어나게 되었거나 중간에 장애물을 만난 경우에는 cur_x, cur_y 위치를 그대로 유지하고,
그렇지 않은 경우에는 tx, ty로 업데이트 하는 것이죠.
(원래는 nx, ny라는 변수명을 즐겨 사용하는데 로직을 바꾸는 과정에서 실수로 tx, ty로 남게 되었습니다 😅)
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 요격 시스템 (Python) (1) | 2023.05.16 |
---|---|
[프로그래머스] 덧칠하기 (Python) (0) | 2023.05.13 |
[프로그래머스] 추억 점수 (Python) (0) | 2023.05.11 |
[프로그래머스] 달리기 경주 (Python) (0) | 2023.05.10 |
[프로그래머스] 배달 (Python) (0) | 2023.03.09 |