본문 바로가기
알고리즘 배우기

[프로그래머스] Lv 1. 공원 산책

by cwin 2024. 6. 25.

2024 NHN IT릴레이 장학금 문제 중 하나와 굉장히 유사한 문제이다.

 

70점 짜리 답안 - 무엇이 문제일까?

1. calc함수의 복잡성: 똑같은 코드가 'E', 'W', 'S', 'N' 반복적으로 사용됨

2. Non-pass test case가 존재함.

def calc(park_list, op, n, pos):
    park_h = len(park_list)-1
    park_w = len(park_list[0])-1
    if op == 'W':
        if (pos[1] - n) < 0:
            return pos
        for step in range(n):
            if park_list[pos[0]][pos[1] - step] == 'X':
                return pos
        return [pos[0], pos[1]-n]
    
    elif op == 'E':
        if (pos[1] + n)>park_w:
            return pos
        for step in range(n):
            if park_list[pos[0]][pos[1]+step]=='X':
                return pos
        return [pos[0], pos[1]+n]
    
    elif op == 'N':
        if (pos[0] - n) < 0:
            return pos
        for step in range(n):
            if park_list[pos[0]-step][pos[1]] == 'X':
                return pos
        return [pos[0]-n, pos[1]]
    
    elif op == 'S':
        if (pos[0] + n) > park_h:
            return pos
        for step in range(n):
            if park_list[pos[0]+step][pos[1]] == 'X':
                return pos
        return [pos[0]+n, pos[1]]
                
            
    
def make_park(park):
    park_list = []
    temp = []
    rows = len(park)
    cols = len(park[0])
    for row in range(rows):
        for col in range(cols):
            char = park[row][col]
            if char == 'S':
                start_pos = [row, col]
            temp.append(char)
        park_list.append(temp)
        temp = []
    return park_list, start_pos
            
def solution(park, routes):
    park_list, pos = make_park(park)
    for cnt in routes:
        op, n = cnt.split(" ")
        n = int(n)
        pos = calc(park_list, op, n, pos)
        
    return pos

 

 

100점짜리 답안(test case 통과 기준)

numpy를 쓰면, list index를 일일히 지정하지 않고, element wise 연산이 가능할 것이다.

# 절대 측위로 변경해보자.
# pos는 절대적 위치 [y, x]값을 담고 있다고 해보자
def calc(park_list, op, n, pos):
    nav = {
        'N': [-1, 0],
        'E': [0, 1],
        'W': [0, -1],
        'S': [1, 0]
          }
    park_h = len(park_list)-1
    park_w = len(park_list[0])-1
    new_pos = [pos[0], pos[1]]
    temp_pos = [pos[0], pos[1]]
    new_pos[0] = pos[0] + (nav[op][0]*n)
    new_pos[1] = pos[1] + (nav[op][1]*n)
    # boundary check
    if (0 > new_pos[0] or new_pos[0] > park_h or 0 > new_pos[1] or new_pos[1] > park_w):
        return pos
    # obstacle check
    for step in range(n):
        temp_pos[0] = temp_pos[0] + nav[op][0]
        temp_pos[1] = temp_pos[1] + nav[op][1]
        if park_list[temp_pos[0]][temp_pos[1]] == 'X':
            return pos
    return new_pos               
            
    
def make_park(park):
    park_list = []
    temp = []
    rows = len(park)
    cols = len(park[0])
    for row in range(rows):
        for col in range(cols):
            char = park[row][col]
            if char == 'S':
                start_pos = [row, col]
            temp.append(char)
        park_list.append(temp)
        temp = []
    return park_list, start_pos
            
def solution(park, routes):
    park_list, pos = make_park(park)
    for cnt in routes:
        op, n = cnt.split(" ")
        n = int(n)
        pos = calc(park_list, op, n, pos)
        
    return pos