본문 바로가기

알고리즘/프로그래머스

[프로그래머스]Lv1. 공원산책(Python)

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

 

  1. S의 위치를 찾아 저장할 리스트
  2. "op n"에서 op으로 n만큼 간다는 것을 조건문을 사용해 분기 
    1. E, W로 갈 때는 행의 변화X / N, S로 갈 때는 열의 변화X => c_row, c_col로 체크
    2. E, S로 갈 때는 부호가 + / W, N로 갈 때는 부호 - => sign으로 체크
  3. 해당 칸으로 이동할 수 있을지의 여부를 체크
    • 범위를 벗어나는 경우
    • 장애물이 있는 경우 => 무시하고 다음 명령으로 점프 => 메인 함수에서 possible로 체크 

 

코드
# 해당 칸으로 갈 수 있는지의 여부를 체크
def check(park, row, col):
    # 범위를 벗어나는 경우 
    if row < 0 or row >= len(park) or col < 0 or col >= len(park[0]):
        return False
    # 장애물이 있는 경우 
    if park[row][col] == 'X':
        return False 
    return True

def solution(park, routes):
    answer = []
    row = 0
    for i in park:
        if 'S' in i:
            col = i.find('S')
            break
        row += 1
    
    for route in routes:
        possible = True # 갈 수 있다면 True, 아니면 False
        if route[0] == 'E' or route[0] == 'W':
            c_row = 0 # 행의 변화 x
        else:
            c_row = 1
            
        if route[0] == 'N' or route[0] == 'S':
            c_col = 0 # 열의 변화 x
        else:
            c_col = 1
            
        if route[0] == 'E' or route[0] == 'S':
            sign = 1    # 부호 양수
        if route[0] == 'W' or route[0] == 'N':
            sign = -1   # 부호 음수 
            
        steps = int(route[2])   # 얼만큼 가야하는지
        for j in range(steps):
            cur_row = row + c_row * sign * (j+1)
            cur_col = col + c_col * sign * (j+1)
            if check(park, cur_row, cur_col) == False :
                possible = False
                break
        
        if possible == True:
            row += c_row * sign * steps
            col += c_col * sign * steps   
        
    answer.append(row)
    answer.append(col)

    return answer