-
2025 프로그래머스 코드챌린지 2차 예선: 택배 상자 꺼내기코딩 테스트/Level 1 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
반응형