본문 바로가기
프로그래머스/Lv.1

공원 산책 - Python, 구현

by 아찌방 2024. 11. 14.

 

 

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

풀이 - 나의 생각

출발 위치를 찾고

 

이동을 하면 됩니다.

 

다만 범위를 벗어나거나, 중간에 장애물이 있으면

 

이동을 안합니다.

 

그러니까 쭉 본 후에

 

문제 없으면 이동해야 합니다.

 

이걸 풀면서 새로 배운게 있어서 기록합니다.

 

for문 else 사용

 

for _ in range(steps):
    nx += dx
    ny += dy
    
    # 범위 체크 및 장애물 확인
    if not (0 <= nx < len(park) and 0 <= ny < len(park[0]) and park[nx][ny] != 'X'):
        break
else:
    # 유효한 이동인 경우에만 최종 위치 갱신
    x, y = nx, ny

 

for문이 문제 없이 진행 되면

 

else문이 실행되고

 

중간에 if문에 걸려서 break 되면

 

else문은 실행되지 않습니다.

 

재밌어....

 

 

코드

 

def solution(park, routes):
    direction = {'N': (-1, 0), 'S': (1, 0), 'E': (0, 1), 'W': (0, -1)}
    
    for i, row in enumerate(park):
        if 'S' in row:
            x, y = i, row.index('S')
            break
    
    for route in routes:
        dir_char, steps = route[0], int(route[2])
        dx, dy = direction[dir_char]

        nx, ny = x, y
        for _ in range(steps):
            nx += dx
            ny += dy
            
            if not (0 <= nx < len(park) and 0 <= ny < len(park[0]) and park[nx][ny] != 'X'):
                break
        else:
            x, y = nx, ny

    return [x, y]

 

def solution(park, routes):
    direct = {'N':(-1,0), 'S':(1,0), 'E':(0,1), 'W':(0,-1)}
    
    for i, row in enumerate(park):
        if 'S' in row:
            x, y = i, row.index('S')
            break
            
    for route in routes:
        dir_char, steps = route[0], int(route[2])
        dx, dy = x, y        
        
        for n in range(steps):
            dx += direct[dir_char][0]
            dy += direct[dir_char][1]
            if not (0 <= dx < len(park) and 0 <= dy < len(park[0]) and park[dx][dy] != 'X'):
                dx, dy = x, y
                break
                
        x, y = dx, dy
        
    return  [x, y]

 

 

 

 

 

다음에 또 봐요

 

728x90