[프로그래머스- Lv.1] 공원산책

Taesoo Kim·2023년 3월 27일
1

CrackingAlgorithm

목록 보기
33/36

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/172928

오랜만에 프로그래머스에 들어가봤는데, 문제가 많이 추가되어서 쉬운 문제 위주로 몇개 풀어보았습니다.

Problem

이번 문제는 단순 구현에 가까운 문제 입니다.
2차원 배열에 시작점을 주고 방향, 거리 커맨드가 주어집니다. 이때, 이동시 장애물이 있다면, 해당 커맨드는 취소되고 원래 자리로 돌아옵니다. 마지막에는 최종 위치의 좌표값을 반환해 주면 되겠습니다.

Approach & Solution

보통 2차원 배열에서 길찾기 문제는 DFS & BFS 내지 백트랙킹으로 풀곤 했었는데, 조건이 그렇게 까다롭지 않아서 단순 구현으로 접근해 보았습니다. 로직은 생각보다 간단합니다. 해당 커맨드중 배열 밖으로 벗어나간다거나 장애물이 있다면 해당 커맨드는 포기하고, 문제가 없다면 이동하는 것으로 짜보았습니다.

def solution(park, routes):
    h = len(park)
    w = len(park[0])
    x,y = 0,0
    
    nav = {
        'S': [1,0],
        'N':[-1,0],
        'W': [0,-1],
        'E':[0,1]
    }
    
    for i in range(h):
        for j in range(w):
            if park[i][j] == "S":
                x = i
                y = j
    
    for route in routes:
        direction, distance = route.split()
        distance = int(distance)
        flag = 0
        step_x = x
        step_y = y
        for i in range(1,distance+1):
            step_x += nav[direction][0]
            step_y += nav[direction][1]
            
            if step_x >= h or step_x <= -1 or step_y >= w or step_y <= -1 or park[step_x][step_y] == 'X':
                flag = 1
                break
            
        if(flag == 0):
            x += nav[direction][0] * distance
            y += nav[direction][1] * distance
    
    answer = [x,y]
    return answer

전체 코드입니다. 하나씩 살펴보겠습니다.

    for i in range(h):
        for j in range(w):
            if park[i][j] == "S":
                x = i
                y = j

배열 전체에서 시작점을 파악하여 저장합니다.

for route in routes:
        direction, distance = route.split()
        distance = int(distance)
        flag = 0
        step_x = x
        step_y = y
        for i in range(1,distance+1):
            step_x += nav[direction][0]
            step_y += nav[direction][1]
            
            if step_x >= h or step_x <= -1 or step_y >= w or step_y <= -1 or park[step_x][step_y] == 'X':
                flag = 1
                break

거리와 방향을 따로 저장한 다음, 해당 방향으로 한 스텝씩 옮기면서 문제가 있는지 확인합니다. 문제가 있다면 flag를 활성화 합니다.

if(flag == 0):
            x += nav[direction][0] * distance
            y += nav[direction][1] * distance

마지막으로 flag가 활성화 되지 않았다면, 이동해 줍니다.

Conclusion

은근히 랜덤하게 문제를 풀다보면 막히는 파트가 단순 구현인것 같습니다. 이런 문제 특성상 고려해야할 포인트가 많고, 하나를 놓치면 끝까지 못찾는 경우가 더러 있더라구요. 결국 많이 연습해 보고, 간결하게 푼 코드를 보면서 배워나가야 할것 같습니다!

profile
SailingToTheMoooon

0개의 댓글