데옹의 블로그

[Python] 프로그래머스 - 공원 산책 [level 1] 본문

python

[Python] 프로그래머스 - 공원 산책 [level 1]

성띠용 2024. 1. 12. 22:32

문제를 제대로 읽지 않으면 경로 탐색이라고 생각이 되는 문제입니다.

하지만 그냥 별 거 없는 문제였죠? 간단한 구현 문제였던 것 같습니다만.. (알고리즘 잘 모름)

 

생각해야 할 것들은 아래와 같습니다.

  • 이건 한 칸씩 가는 문제가 아닌, 경로에 문제가 있다면 애초에 가지를 말아야 합니다.
  • N,S를 잘 보고 풀어야 합니다. N은 북쪽, S는 남쪽이라 헷갈릴 수 있지만 N은 y축 숫자를 줄여야하고, S는 y축 숫자를 늘려야 합니다.
  • 반환 값이 [세로 좌표, 가로 좌표] 입니다.

위에 것들만 신경쓰면 진짜 쉬운 문제였습니다.

 

쓰잘데 없는 설명은 치우고 그냥 코드에 주석 달겠습니다.

귀찮아도 하나씩 읽어보면 이 사람이 왜 이렇게 풀었나 알 수 있을 것이라 생각됩니다! 피드백 마구마구 하세요.

 

def solution(park, routes):

	# dictionary로 한 이유는 그냥 빠를 것 같아서 입니다.
    # 한 번에 저장하고 바로바로 찾을 수 있게 했습니다. (if/elif/else문 쓰기 싫어서)
    d = {"E": (1,0), "W": (-1,0), "S": (0,1), "N": (0,-1)}
    
    # 시작 위치를 찾아서 바로 x,y에 할당합니다.
    # 할당하고 나서는 for문이 딱히 필요가 없기 때문에 break 했습니다.
    for i in range(len(park)):
        if "S" in park[i]:
            x, y = park[i].index("S"), i
            break
            
    # 여기서부터 시작인데 굉장히 간단해요.
    # tempx, tempy => 임시로 x,y를 저장해두는 변수
    # tempx, tempy는 처음에 더해도 되나? 싶었는데 그럼 장애물이 있는 지 판단할 수 없다고 생각했습니다.
    # 그래서 한 칸씩 가면서 판단하기로 했습니다.
    for i in routes:
        tempx, tempy = x, y
        v, cnt = i.split()
        # ex) d["W"] 라면 (-1,0)이 반환됨.
        dx, dy = d[v]
        # cnt만큼 가다가 문제가 생기면 바로 취소 때리기
        for j in range(int(cnt)):
            # park를 벗어나거나, 장애물이 있을 경우엔
            # 바로 break를 걸었습니다.
            # 그리고 정상적인 루트일 경우에는 tempx와 tempy에 정확한 값을 집어넣습니다.
            if 0 <= tempx + dx < len(park[0]) and 0 <= tempy + dy < len(park) and park[tempy+dy][tempx+dx] != "X":
                tempx, tempy = tempx + dx, tempy + dy
            else:
                break
        # 문제가 없었다면 for문은 정상적으로 끝이 났을테고,
        # break가 없었으니 for - else문을 활용해 임시 좌표값을 다시 x,y에 할당합니다.
        else:
            x, y = tempx, tempy
            
    # 반환! (세로좌표, 가로좌표) -> 문제에서 이렇게 반환하라고 함
    return [y,x]