Python/Algorithm

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

언킴 2023. 8. 24. 17:53
반응형

 

공원 산책과 같은 문제는 종종 코테에 나오는 것 같아서 리뷰를 할 예정이다.

 

 

 

구구절절 문제가 길어보지만, 조건문을 달아서 쉽게 풀이할 수 있다. 

 

먼저, S, O, X로 된 입력 문장을 풀이하기 쉽게 숫자로 변환하는 과정이 필요하다. X는 1로 설정하고, S, O는 0으로 설정하면 아래와 같이 코딩할 수 있다.

def solution(park, routes):
    nrow, ncol = len(park)-1, len(park[0])-1
    coord = []
    for i in range(nrow+1):
        rows = []
        for j in range(ncol+1):
            idx = park[i][j]
            if idx == 'S':
                row, col = i, j
                rows.append(0)
            elif idx == 'X':
                rows.append(1)
            else:
                rows.append(0)
        coord.append(rows)

그 다음으로, 동, 서, 남, 북으로 움직이는 값에 0, -1, 1 등의 값을 부여한다. 예를 들어, 동쪽으로 움직이는 경우 col 좌표가 1로 이동하고, 남쪽으로 움직이는 경우 row 좌표가 1 만큼 이동하는 것을 의미한다.

    move_row = {'E':0, 'W':0, 'N':-1, 'S':1}
    move_col = {'E':1, 'W':-1, 'N':0, 'S':0}

그런 다음 route를 입력으로 받아서, 각 좌표에 대한 이동을 하나씩 시행한다. 처음에는 공원을 벗어나는 경우에 대해서 먼저 처리를 해주는 과정이 필요하다. 그 다음으로는 각 좌표가 한 칸(step)씩 움직일 때 장애물이 존재하는 지 여부를 판단하고, 장애물이 존재하면 error += 1로 지정하여 마지막에 error가 0이면 시작지점을 이동한 지점으로 변환하는 형태로 진행할 수 있다. 

def solution(park, routes):
    nrow, ncol = len(park)-1, len(park[0])-1
    coord = []
    for i in range(nrow+1):
        rows = []
        for j in range(ncol+1):
            idx = park[i][j]
            if idx == 'S':
                row, col = i, j
                rows.append(0)
            elif idx == 'X':
                rows.append(1)
            else:
                rows.append(0)
        coord.append(rows)
    
    move_row = {'E':0, 'W':0, 'N':-1, 'S':1}
    move_col = {'E':1, 'W':-1, 'N':0, 'S':0}
    for route in routes:
        error = 0
        d, step = route.split()
        
        step = int(step) 
        
        new_row = row + move_row[d] * step
        new_col = col + move_col[d] * step

        if (new_row < 0) or (new_row > nrow):
            continue
        
        elif (new_col < 0) or (new_col > ncol):
            continue 
            
        elif row != new_row:
            for r in range(1, step+1):
                r_step = row + move_row[d]*r
                if coord[r_step][col]:
                    error += 1

        elif col != new_col:
            for c in range(1, step+1):
                c_step = col + move_col[d]*c
                if coord[row][c_step]:
                    error += 1

        if error == 0:
            row = new_row
            col = new_col

        elif error > 0:
            row = row 
            col = col

    return [row, col]