[programmers/py] 공원 산책

승민·2023년 4월 14일

알고리즘

목록 보기
15/171

공원 산책

https://school.programmers.co.kr/learn/courses/30/lessons/172928?language=python3

문제설명

  • 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
    • ["방향 거리", "방향 거리" … ]
  • 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
    • 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
    • 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.

제한사항

  • park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.
    • S : 시작 지점
    • O : 이동 가능한 통로
    • X : 장애물
    • park는 직사각형 모양입니다.
  • routes의 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미합니다.
    • op는 다음 네 가지중 하나로 이루어져 있습니다.
    • N : 북쪽으로 주어진 칸만큼 이동합니다.
    • S : 남쪽으로 주어진 칸만큼 이동합니다.
    • W : 서쪽으로 주어진 칸만큼 이동합니다.
    • E : 동쪽으로 주어진 칸만큼 이동합니다.

풀이

  1. park에서 s를 찾아 시작 위치를 정합니다.
  2. route를 돌며 주어진 무시 명령에 포함될 경우 flag = False로 변경합니다.
  3. flag = False면 현재 위치를 변경하지 않습니다.
def solution(park, routes):
    # 시작 위치
    start = [0,0]
    r, c = len(park), len(park[0])
    
    # 북, 남, 서, 동
    dt = {
        'N': [-1, 0],
        "S": [1, 0],
        "W": [0, -1],
        "E": [0, 1],
    }
    
    for p in range(r):
        if park[p].find("S") != -1:
            start = [p, park[p].find("S")]
               
    for r in routes:
        d, n = r.split(" ") # 방향과 이동 횟수
        mx, my = dt[d] # 방향 이동
        x, y = start[0], start[1] # 현재 위치
        flag = True
        
        for i in range(1, int(n)+1):
            nx = x + mx*i
            ny = y + my*i
            if nx < 0 or nx > len(park)-1 or ny < 0 or ny > len(park[0])-1:
                flag = False
                break
            if park[nx][ny] == "X":
                flag = False
                break
        
        if flag :
            start = [nx, ny]
            
                
    return start

0개의 댓글