본문 바로가기

개발/Algorithm

[프로그래머스] 최소 직사각형(python)

Programmers, 최소 직사각형

프로그래머스 위클리 챌린지 8주차

TL;DR

  • 배열(리스트, list/array)
  • 구현(implementation)

문제 요약

1. 다양한 크기의 명함들을 모두 수납할 수 있으면서 작아서 들고 다니기 편한 명함 지갑을 만들어야 한다.
2. 조사된 명함의 크기들을 모두 넣을 수 있으면서도 가장 작은 지갑의 크기를 반환하는 함수를 작성해야 한다.
3. 명함의 경우 가로로 눕혀서 수납할 수 있다.

 

- 가로와 세로 길이가 다른 명함의 크기가 조사된다. 이 때, 명함은 가로로 눕혀서 지갑에 넣을 수 있다. 이 말인 즉슨, 가로로 눕힌 명함. 즉, 주어진 가로의 길이와 세로의 길이를 반대로 했을 때도 조사해야 한다는 것이다.

- 나는 이 문제를 모두 가로로 눕혔다고 가정하여 가로의 길이가 세로의 길이보다 크도록 입력값을 조정한 뒤, 그 중 가장 큰 명함을 담을 수 있는(가장 큰 명함보다 크기가 작은 명함들은 자연스럽게 수납할 수 있는) 명함 지갑의 크기를 구하도록 작성하였다.

입출력 형태

입출력 예시

 

예시 1 :: 가장 긴 가로의 길이(80)과 가장 긴 세로의 길이(50)일 때의 지갑의 크기이다. [30, 70]의 명함을 가로로 눕히면 [70, 30]으로 생각할 수 있다.

예시 2 :: 가장 긴 가로의 길이(15)와 가장 긴 세로의 길이(8)일 때의 지갑의 크기이다. 마찬가지로 [8, 15], [5, 15]의 명함을 가로로 눕히면 [15, 8], [15, 5]가 된다.

예시 3 :: 가장 긴 가로의 길이(19)와 가장 긴 세로의 길이(7)일 때의 지갑의 크기이다. [6, 16], [7, 11]의 명함을 가로로 눕히면 [16, 6], [11, 7]이 된다.

풀이

def solution(sizes):
    answer = 0
    # 1. 주어진 명함을 가로로 눕혔을 때의 경우로 만들기
    for i, (width, height) in enumerate(sizes):
        if height > width:
            sizes[i] = [height, width]
    # 2. 주어진 가로와 세로에서 가장 큰 값을 찾아 곱하기
    widths, heights = list(zip(*sizes))
    return max(widths) * max(heights)

 

주어진 명함의 크기들을 조회하며 가로의 길이가 세로의 길이보다 짧은 경우는 가로로 눕힌다 생각하고 두 길이를 바꿔준다.

이렇게 되면 리스트 각 원소의 0번 인덱스에는에는 가로의 길이가, 1번 인덱스에는 세로의 길이가 저장되게 된다.

이를 zip* 연산자를 통해 그림과 같이 가로의 길이, 세로의 길이끼리 묶을 수 있다.

가로와 세로의 길이를 따로 묶기

 

unzip 역할을 수행하는 *를 통해 리스트의 각 원소들을 풀어준 뒤 zip을 통해 가로와 세로 길이 별로 묶어준다. 이렇게 얻어낸 가로의 길이들과 세로의 길이들에서 가장 큰 값을 찾아 곱하면 정답을 얻을 수 있다.

반응형