Algorithm/Simulation

[Python] 프로그래머스 코드 챌린지 택배 상자 꺼내기

코딩쪼앙 2025. 3. 20. 18:03

문제

 

프로그래머스

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

programmers.co.kr

문제 풀이

1. 상자를 쌓기 위한 높이 계산

  • 모듈러 연산 후 나머지가 있으면 한 줄 더 쌓아야 하므로 +1을 추가

2. 배열 채우기

  • 최종 상자의 개수 n이 될 때까지 배열을 채운다.
  • n보다 커지면 0으로 유지 → 상자를 꺼낼 때 연산하기 쉽게 하기 위함
  • 짝수 번째 줄은 반대로 쌓아야 하므로 reverse() 함수 사용

3. 상자 꺼내기

  • 맨 윗칸이 비어 있으면 동작이 한 번 덜 수행되므로 -1
    • 즉, 맨 윗칸이 0이면 비어 있는 것
  • 맨 윗칸이 0이 아니면 비어 있지 않으므로
    → 전체 높이에서 상자가 있는 열의 크기를 빼준다.

코드

def solution(n, w, num):
    answer = 0
    height = 0
    # 세로 크기 구하기
    if n % w == 0:
        height = n // w
    else:
        height = n // w + 1
    
    ware_house = [[0] * w for _ in range(height)]
    
    # 상자 넣기
    box = 1
    for i in range(height):
        for j in range(w):
            if box > n:
                break
            ware_house[i][j] = box
            box += 1
                
    for i in range(height):
        if i % 2 != 0:
            ware_house[i].reverse()
            
    for i in range(height):
        for j in range(w):
            if ware_house[i][j] == num:
                if ware_house[height - 1][j] != 0:
                    answer = height - i
                else:
                    answer = height - i - 1
        
    return answer

 

다른 사람의 풀이

✅ 상자를 꺼낼 때 현재 행에서 맨 아래까지 내려가며 몇 번 연산이 필요한지 확인할 수 있다.

for i in range(len(storage)):
        for j in range(len(storage[0])):
            if storage[i][j] == num:
                d = i
                while d < h and storage[d][j]:    # 꺼낼 박스가 있으면
                    answer += 1
                    d += 1	# 아래로 내려감