ror_coding

[Programmers] 공원 산책 - 172928 본문

Algorithm/Python

[Programmers] 공원 산책 - 172928

ro_rdil_31 2024. 10. 23. 14:06
728x90

list out of range 가 너무 많이 떠서 index 활용 부분 고민이 컸다.

쉬워보이지만 은근 고려해야 할게 많아서 오래 걸린 문제..

 

Question

 

공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

Point

 

  • way를 dictionary로 만들 때 value에 tuple을 넣어서 상하좌우를 표시.
  • 공원(칸)을 넘어가거나 가는 길에 'X'가 있으면 되돌아 옴.
  • 가는 길 index를 [ pre_loc : loc + 1] 으로 하지 않고 ( [2:0] 등으로 입력되면 동작하지 않기 때문 ) min 값을 시작, max 값을 끝에 둠. (like [ min_loc : max_loc + 1 ])
  • op == 'W' or 'E' 일땐 park[ 고정 ] [ ~이동~ ] 형식이 되지만, op == 'S' or 'N'처럼 위아래 이동일 땐 list 인 park [ ~이동~] [고정] 으로 값을 볼 수 없기 때문에 for문을 이용해서 한 줄씩 봄.

 

Code

 

def solution(park, routes):
    loc = [-1,-1]
    lh, lw = len(park), len(park[0])
    way = {'E':(0,1), 'N':(-1,0), 'W':(0,-1), 'S':(1,0)}
    
    for idx,p in enumerate(park): # 시작 지점 찾음.
        if p.find('S') != -1 : loc = [idx, p.find('S')]
        
    pre_loc = loc.copy()
    for route in routes:
        op, n = route.split(' ')
        n = int(n)
        
        loc[0] += way[op][0]*n
        loc[1] += way[op][1]*n
        
        if not(0<=loc[0]<lh and 0<=loc[1]<lw) : loc = pre_loc.copy(); continue # 공원 벗어나면 이전 loc.
        
        if (op=='W' or op=='E'):
            min_loc,max_loc = min(pre_loc[1],loc[1]), max(pre_loc[1],loc[1])
            if 'X' in park[loc[0]][min_loc:max_loc+1]: # 좌우 가는 길 'X' 여부 확인.
                loc = pre_loc.copy()
    
        else : 
            is_X = False
            min_loc,max_loc = min(pre_loc[0],loc[0]), max(pre_loc[0],loc[0])
            for p in park[min_loc:max_loc+1]: # 상하 가는 길 'X' 여부 확인.
                if p[loc[1]] == 'X': is_X = True; break
            
            if is_X : loc = pre_loc.copy(); continue # 가는 길 'X'가 없는 경우에만 이동.
        
        pre_loc = loc.copy()
        
    return loc

 

now me

On my github

 

728x90