코딩 테스트/Level 1
2025 프로그래머스 코드챌린지 2차 예선: 택배 상자 꺼내기
컴닥
2025. 4. 6. 18:07
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/389478
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
def solution(n, w, num):
answer = 0
cargo = []
point_x = point_y = None
# 택배상자 쌓기
for i in range(n // w + 1):
if i % 2:
start, end, step = (i + 1) * w - 1, i * w - 1, -1
else:
start, end, step = i * w, (i + 1) * w, 1
cargo.append(tuple(j + 1 if j < n else 0 for j in range(start, end, step)))
# num 택배 상자 위치 찾기
for y, row in enumerate(cargo):
for x, each in enumerate(row):
if each == num:
point_x, point_y = x, y
# num 상자 위 박스 체크
for y in range(len(cargo) - 1, point_y - 1, -1):
if cargo[y][point_x] != 0:
answer += 1
return answer
for 문을 줄이는 것은 효율성을 많이 올려준다.
cargo에 숫자를 채우면서 num의 좌표를 찾는다면 for 문을 하나 줄일 수 있다!
def solution(n, w, num):
answer = 0
cargo = []
point_x = point_y = None
for y in range(n // w + 1):
if y % 2:
start, end, step = (y + 1) * w - 1, y * w - 1, -1
else:
start, end, step = y * w, (y + 1) * w, 1
row = []
for x, each in enumerate(range(start, end, step)):
row.append(each + 1 if each < n else 0)
if each + 1 == num:
point_x, point_y = x, y
cargo.append(row)
for y in range(len(cargo) - 1, point_y - 1, -1):
if cargo[y][point_x] != 0:
answer += 1
return answer
실제로 시간이 약간 절약됨을 확인할 수 있다.
사실 파이썬은 반복문 보다 리스트 컴프리헨션으로 구현했을 때 속도가 더 빠를 수 있기 때문에... (파이썬의 신비)
실제로 테스트 해 보는 것이 좋다.
하지만 이런 문제는 수학적으로 푸는 게 가장 좋긴 하다.
나눗셈의 몫과 나머지를 이용해 좌표(coordinate)를 구할 수 있다.
def solution(n, w, num):
def find_coordinate(number):
number -= 1
y = number // w
if y % 2 == 0:
x = number % w
else:
x = w - number % w - 1
return x, y
num_x, num_y = find_coordinate(num)
n_x, n_y = find_coordinate(n)
last_line = 0
if n_y % 2 == 0:
if n_y > num_y and num_x > n_x:
last_line = -1
else:
if n_y > num_y and num_x < n_x:
last_line = -1
return (n_y - num_y + 1) + last_line
반응형