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
'알고리즘 배우기' 카테고리의 다른 글
[엘리스 코딩] 엘리스 코드 챌린지 1일차 (0) | 2024.07.08 |
---|---|
[프로그래머스] Lv 2. 도넛과 막대 그래프 (1) | 2024.06.30 |
[프로그래머스] Lv 1. 개인정보 수집 유효기간 (0) | 2024.06.30 |
[프로그래머스] Lv 코테입문. 안전지대 (0) | 2024.06.25 |
[프로그래머스] Lv 1. 바탕화면 정리 (0) | 2024.06.25 |