[Programmers][Py] 공원 산책

mj·2024년 7월 12일
0

코딩테스트문제

목록 보기
33/50

✅ 문제

문제 바로가기


✅ 나의 구현 과정

💡나의 아이디어

  1. 시작 위치 찾기
  2. routes를 돌며 이동 명령 수행
  3. 한칸씩 이동하며 좌표가 범위내에 있는지, 이동과정중에 장애물이 없는지 확인하기
  4. 위의 조건에 맞지 않으면 해당명령은 취소처리하고 다음 명령으로 넘어간다.

구현

0. 필요한 변수 설정

이동방향에 맞는 좌표값의 변화를 딕셔너리에 담았다.
예를들어, E(동쪽)방향의 경우 행은 그대로(+0)있고 열은 +1

move = {"E": (0,1), "W": (0,-1), "S": (1,0), "N": (-1,0)}

1. 시작 위치 찾기

공원의 모든 좌표를 돌며 "S"인지 확인하고, "S"이면 그 위치를 현재위치 (loc)로 설정하고 탐색을 끝낸다.

# 1. 시작 위치 찾기
    for x in range(h):
        if "S" in park[x]:
            loc = [x, park[x].index("S")]
            break

2. 이동 명령 수행하기

routes의 명령들을 순차적으로 실행한다.

제한 사항

이동했을 때의 위치가 공원 좌표 범위 안에 있어야 하고, 장애물이 없는 길로만 이동할 수 있다.

예를들어 "E 2" 명령을 처리한다고 가정하자. 이 경우 동쪽으로 2칸 이동해야한다.
동쪽으로 한 칸씩 이동하며 위의 제한사항 조건에 맞는지 확인한다.

  • 조건에 맞지 않는 경우, 이 명령은 취소처리되므로 현재위치에 변화없이 다음 명령을 수행한다.
  • 조건에 맞는 경우, 최종 이동 위치를 현재 위치로 저장하고 그 위치에서부터 다음 명령을 수행한다.

✅ 나의 코드

def solution(park, routes):
    h = len(park)
    w = len(park[0])
    loc = [] # 현재위치
    move = {"E": (0,1), "W": (0,-1), "S": (1,0), "N": (-1,0)}
    
    # 1. 시작 위치 찾기
    for x in range(h):
        if "S" in park[x]:
            loc = [x, park[x].index("S")]
            break

    # 2. 이동
    for route in routes:
        op, n = route.split(" ")
        op = move[op]
        n = int(n)

        tx, ty = loc[0], loc[1]

        # 한칸씩 n번 이동해보기 
        for _ in range(n):
            tx += op[0]
            ty += op[1]
            if not (0<= tx < h and 0<= ty < w and park[tx][ty] != "X"): break      
        else:
            loc = [tx, ty]

    return loc

실수했던 것

# BEFORE
if not (0<= tx < h and 0<= ty < w and park[tx][ty] == "O"): break

출발지점에서 시작해 이동하다보면 다시 출발지점으로 돌아오는 경우도 있다.
위의 코드는 출발지점도 장애물로 인식하므로 아래 코드 처럼 "X"표시인 경우만 장애물로 인식하도록 바꿔주어야 한다.

# AFTER
if not (0<= tx < h and 0<= ty < w and park[tx][ty] != "X"): break
profile
일단 할 수 있는걸 하자.

0개의 댓글