본문 바로가기

알고리즘

프로그래머스, 공원산책

728x90

프로그래머스, 공원산책

 

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

분류

시뮬레이션

 

풀이

일단, 시작 위치(S)를 알아야 한다.

중요한 포인트는 산책을 할 수 있는지 여부와 산책 할 수 없을 경우 스킵한다는 점!

 

처음에 스킵한다는 걸 어떻게 할까 고민하다가 flag(True, False)사용

nr, nc로 도달하게 될 장소를 갈 수 있는지 확인! 만약, 주어진 횟수만큼 갈 수 있다면, flag를 True로 하고 현재 위치를 이동시켜줬다. 만약 장애물이 있거나 공원에서 벗어나게 되어 갈 수 없다면 탐색종료후, flag를 False로 하고 이전 위치 그대로 두고 탐색하는 식으로 구현했다.

 

소요 시간

1시간 30분 걸렸다.

30분내에 풀지 못해서 복습해야 하는 문제(accepted)로 분류했다.

디버깅을 정말 많이 했다.

 

예외 케이스

park =  ["OOOOO", "OOOOO", "OOSOO", "OOOOO", "OOOOO"]
routes =  ["E 2", "E 1", "W 4", "W 1", "S 2", "S 1", "N 4", "N 1"]

result = [0, 0]

잘못된 코드는 아래와 같았다.

 

        if 0 <= nr < R and 0 <= nc < C and park[nr][nc] == 'O':
            nr = nr
            nc = nc

'O' 일때 뿐만 아니라, 'S' 일 때도 산책할 수 있으므로 이부분 코드가 잘못되서 테스트 케이스 2개 불통이었다.

 

 

풀이 코드

park =  ["OOOOO", "OOOOO", "OOSOO", "OOOOO", "OOOOO"]
routes =  ["E 2", "E 1", "W 4", "W 1", "S 2", "S 1", "N 4", "N 1"]

R = len(park)
C = len(park[0])

for r in range(R):
    for c in range(C):
        if park[r][c] == 'S':
            sr = r
            sc = c
            break
# 북동남서
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]
d_dict = {'N' : 0, 'E': 1, 'S': 2, 'W': 3}

cr = sr
cc = sc

for route in routes:
    d, move = route.split()
    
    nr = cr
    nc = cc
    flag = True
    for _ in range(int(move)):
        nr += dr[d_dict[d]]
        nc += dc[d_dict[d]]
        
        if 0 <= nr < R and 0 <= nc < C and park[nr][nc] != 'X':
            nr = nr
            nc = nc
        else:
            flag = False
            break
    
    if flag == True:
        cr = nr
        cc = nc

print(cr, cc)

 

제출용 코드

def solution(park, routes):    
    R = len(park)
    C = len(park[0])

    for r in range(R):
        for c in range(C):
            if park[r][c] == 'S':
                sr = r
                sc = c
                break
    # 북동남서
    dr = [-1, 0, 1, 0]
    dc = [0, 1, 0, -1]
    d_dict = {'N' : 0, 'E': 1, 'S': 2, 'W': 3}

    cr = sr
    cc = sc

    for route in routes:
        d, move = route.split()

        nr = cr
        nc = cc
        flag = True
        for _ in range(int(move)):
            nr += dr[d_dict[d]]
            nc += dc[d_dict[d]]

            if 0 <= nr < R and 0 <= nc < C and park[nr][nc] != 'X':
                nr = nr
                nc = nc
            else:
                flag = False
                break

        if flag == True:
            cr = nr
            cc = nc
            
    answer = [cr, cc]
    return answer