코테 준비

[프로그래머스] 공원 산책

박수련 2024. 2. 29. 23:18

문제 요약

https://school.programmers.co.kr/learn/courses/30/lessons/172928

 

시작점 S, 지나갈 수 있는 길 O, 장애물 X로 구성된 이차원 그래프 park가 주어진다.
routes에는 방향과 이동거리가 주어진다.
시작점으로부터 이동을 하는데 이때 routes에서 주어진 경로에 장애물이 있다면 무시하고 다음 경로를 수행한다.
모든 경로를 수행했을 때 최종 위치를 반환한다.

 

접근

가장 먼저 시작점의 좌표를 찾아주었다.
그리고 check함수를 통해 가야하는 경로에 장애물이 있는지, 공원 밖을 넘어가는지 확인해주었다.
check함수는 갈 수 없는 경로라면 False를 반환하고, 갈 수 있는 경로라면 True를 반환한다. 

반환값이 True값이라면 routes에 제시된 방향으로 n만큼 이동시켰다. 

 

코드

def solution(park, routes):
    h, w = len(park), len(park[0])

    def check(x, y, op, n):
        if op == "N":
            for i in range(1, n + 1):
                if x - i < 0 or park[x-i][y] == "X":
                    return False
        elif op == "S":
            for i in range(1, n + 1):
                if x + i >= h or park[x+i][y] == "X":
                    return False
        elif op == "W":
            for i in range(1, n + 1):
                if y - i < 0 or park[x][y-i] == "X":
                    return False
        elif op == "E":
            for i in range(1, n + 1):
                if y + i >= w or park[x][y+i] == "X":
                    return False

        return True
        

    # 시작점 찾기
    x, y = -1, -1
    for i in range(h):
        for j in range(w):
            if park[i][j] == "S":
                x, y = i, j
                break
        if x != -1 and y != -1:
            break

    # 경로 따라가기
    for r in routes:
        op, n = map(str, r.split())
        n = int(n)

        if check(x, y, op, n):
            if op == "N":
                x -= n
            elif op == "S":
                x += n
            elif op == "W":
                y -= n
            else:
                y += n

    return [x, y]