상세 컨텐츠

본문 제목

[프로그래머스][LV1] 택배 상자 꺼내기

알고리즘, 자료구조

by grizzly 2025. 3. 6. 10:17

본문

def solution(n, w, num):
    if num % w == 0:
        temp = num // w
    else:
        temp = num // w + 1
    
    if n % w == 0:
        temp1 = n // w
    else:
        temp1 = n // w + 1
    
    if temp1 == temp:
        return 1
    
    if temp % 2 == 0: 
        if num % w == 0:
            cur = 1
        else:
            cur = w - (num % w) + 1  
    else:  
        if num % w == 0:
            cur = w
        else:
            cur = num % w
    
    if temp1 % 2 == 0:  
        if n % w == 0:
            cur1 = 1
        else:
            cur1 = w - (n % w) + 1  
    else: 
        if n % w == 0:
            cur1 = w
        else:
            cur1 = n % w
    
    result = temp1 - temp
    
    if temp1 % 2 == 0:  
        if cur1 <= cur:
            result += 1
    else:  
        if cur1 >= cur:
            result += 1
    
    return result

문제에 대한 조건을 설명하면 가로로 몇 개를 놓을 것인지 w로 입력이 들어오고 총 상자가 몇 개인지 n으로 입력이 들어온다.

가로로 상자를 놓을 때는 가장 아래 첫 번째 줄은 왼쪽에서 오른쪽 순으로 놓게 되고 그 다음 줄은 반대로 오른쪽부터 왼쪽으로 놓게 된다.

직관적으로 아래 그림과 같다.

해당 문제를 풀 때 어떻게 풀 지를 고민했다. 처음엔 정말로 쌓아볼까 생각을 했다. 하지만 해당 문제처럼 n이나 w가 작고 따로 공간에 대한 제한이 없는 경우는 쉽게 풀 수 있지만 이러한 제한 사항이 타이트하게 주어져서 초과될 경우 어렵지 않을까 생각을 했다.

 

해당 문제에서 3번 상자를 꺼내기 위해서는 위에 놓인 22, 15, 10을 꺼낸 후 꺼내야 하기 때문에 4번째로 꺼내게 된다. 따라서 위에 쌓인 것이 몇 개인지만 찾으면 문제 해결이 가능하다 생각하여 굳이 실제로 쌓지 않고 그냥 단순히 규칙을 나누고 세기만 하였다.

 

코드를 보면 일단 변수 명을 아무 의미 없이 처박아놔서 해석하기가 참 별로다. 일단 코드 자체에서 temp 변수의 경우 그냥 공간이 필요해서 선언한 변수에 가깝다. 코드 자체의 전체적인 틀은 해당 문제가 따로 자료구조나 알고리즘을 쓴다기 보단 단순 구현에 예외 상황을 얼마나 잘 챙기냐가 중요하다고 생각한다. 그리하여 예외 상황 또는 일종의 규칙을 찾기 위해 노력하였다. n을 나누는 것을 기준으로 찾은 부분은 해당 총 층을 알아내기 위해서 짝수 층이라면 마지막에 오른쪽에서부터 채워지게 되고 홀수 층은 그 반대이다. 타겟에 해당하는 층도 마찬가지이다. 이렇게 케이스를 분리시킨 이유는 오른쪽부터 출발할 경우 마지막 택배상자가 타겟보다 위치가 왼쪽에 있는 경우 치워야 할 택배가 추가되지만, 오른쪽에 있다면 타겟 위에 마지막 층은 존재하지 않기 때문이다. 이러한 경우를 제외시키기 위해서 케이스를 분리시켰다.

이런식의로 예외 케이스를 나눠서 진행하였다.

 

다른 사람의 풀이가 궁금하여 찾아봤다.

짧은 풀이가 세상에서 가장 멋있는 거 같다. (대단하다)

관련글 더보기