본문 바로가기

Algorithm/코딩테스트 고득점 Kit

[고득점 Kit / 완전탐색] 최소직사각형

https://school.programmers.co.kr/learn/courses/30/lessons/86491

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

이 문제의 답이 나오는 과정은 간단하다.

 

1. 가로, 세로길이를 내림차순으로 정렬한다. (즉, 모든 명함이 가로길이 < 세로길이가 되도록)

2. 각 명함의 가로길이의 최댓값, 세로길이의 최댓값을 각각 곱해준다.

 

이를 코드로써 구현해주면 된다. 필자는 아래와 같이 무식한 방법으로 구현했다.

 

def solution(sizes):
    width = 0
    height = 0

    for i in range(len(sizes)):
        if sizes[i][0] < sizes[i][1]:
            sizes[i][0], sizes[i][1] = sizes[i][1], sizes[i][0]
        
    for i in range(len(sizes)):
        if sizes[i][0] > width:
            width = sizes[i][0]
        
    for i in range(len(sizes)):
        if sizes[i][1] > height:
            height = sizes[i][1]
            
    answer = width * height
    
    return answer

 

하지만 아무리 생각해도 좀 더 좋은 풀이가 있을 것이라 생각해 다른 사람들의 풀이를 참고해봤다.

 

그 중 가장 파이썬스럽고, 현실적으로 시험장에서 떠올릴 수 있을 만한 답안을 찾았다.

 

def solution(sizes):
    row = 0
    col = 0
    for a, b in sizes:
        if a < b:
            a, b = b, a
        row = max(row, a)
        col = max(col, b)
    return row * col

 

 

반복문의 인자를 위와 같이 받아줌으로써 2차원 리스트의 원소값을 나타내었다. 이렇게 하면 번거롭게 반복문을 3번씩이나 쓸 필요가 없다!