Programming/프로그래머스

프로그래머스 - 택배 상자 꺼내기 (파이썬)

pental 2025. 3. 26. 04:54

https://school.programmers.co.kr/learn/courses/30/lessons/389478?language=python3

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이

다른 사람 풀이를 보고 한숨을 쉬었던 문제이다..

def solution(n, w, num):
    m1 = num%(w*2)
    m2 = ((w*2+1) - m1)%(w*2)
    # num 이상 n 이하의 수들 중 2*w로 나눈 나머지가 m1,m2인 것들의 수를 세면 된다.
    return len(range(num,n+1,w*2)) + len(range(num + (m2-m1)%(w*2), n+1, w*2))

상상도 못해본 풀이이다.

array = [[] for i in range((n // w) + 1)]

일단 나는 이차원 배열을 n // w + 1 만큼 만들어 택배가 쌓아질수 있는 총 높이 만큼 만들었다.

row = 0
current_w = 0
for i in range(1, n + 1) :
    array[row].append(i)
    current_w += 1
    if current_w >= w :
        row += 1
        current_w = 0

그리고 각각 택배상자들을 지그재그로 놓기 전에, 왼쪽에서 오른쪽으로 모두 옮기는 작업을 진행하였다.

이거 말고도 다른게 하는 방법이 있을텐데 새벽에 대충 푼거라 머리가 잘 안돌아 간다.

if len(array) > 1 and len(array[-1]) != len(array[-2]):
        for i in range(len(array[-2]) - len(array[-1])):
            array[-1].append("X")

그리고 지그재그로 쌓다보면 아마 빈 공간이 반대로 되있는 경우도 존재 할 것이다. 아래 상황처럼.

이걸 방지하기 위해서 X라는 임의의 택배 상자를 집어 넣었다.

for i in range(len(array)) :
        if i % 2 == 1 :
            array[i].reverse()

무식하게 두번째 줄의 배수는 reverse 해서 택배 위치 맞춰주기

	[[1, 2, 3, 4, 5, 6], [12, 11, 10, 9, 8, 7], [13, 14, 15, 16, 17, 18], ['X', 'X', 22, 21, 20, 19]]

지금까지는 이렇게 택배 상자를 모두 놓을 수 있었다.

box_row = 0
box_col = 0
for i in range(len(array)) :
    for j in range(len(array[0])):
        if array[i][j] == num :
            box_row, box_col = i, j
            break
print(box_row, box_col)

찾아야 하는 택배 상자의 위치를 찾고,

for index, value in enumerate(array) :
  if index >= box_row :
      if array[index][box_col] != "X" :
          answer.append(array[index][box_col])

택배 상자의 위치에서 위로 있는 택배들만 answer에 집어넣으면 끝

코드

def solution(n, w, num):
    answer = []
    array = [[] for i in range((n // w) + 1)]
    
    row = 0
    current_w = 0
    for i in range(1, n + 1) :
        array[row].append(i)
        current_w += 1
        if current_w >= w :
            row += 1
            current_w = 0
            
    if len(array) > 1 and len(array[-1]) != len(array[-2]):
        for i in range(len(array[-2]) - len(array[-1])):
            array[-1].append("X")

    for i in range(len(array)) :
        if i % 2 == 1 :
            array[i].reverse()
    print(array)
    box_row = 0
    box_col = 0
    for i in range(len(array)) :
        for j in range(len(array[0])):
            if array[i][j] == num :
                box_row, box_col = i, j
                break
    print(box_row, box_col)
    for index, value in enumerate(array) :
        if index >= box_row :
            if array[index][box_col] != "X" :
                answer.append(array[index][box_col])

    return len(answer)