완전 탐색 - 최소 직사각형

krystal·2023년 10월 4일
0

코딩테스트 대비

목록 보기
5/11

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

우선 가로 세로 중에 제일 큰 수를 구한다.
가로가 제일 클 경우, 명함들 중 가로보다 세로가 큰 경우를 찾아서 가로 -> 세로, 세로 -> 가로 스왑해준다.
세로가 제일 클 경우, 명함들 중 세로보다 가로가 큰 경우를 찾아서 세로 -> 가로, 가로 -> 세로 스왑해준다.

그 후, 스왑해준 세로(가로) 중에 제일 큰 수를 구한다음,
처음 구했던 제일 큰 수와 곱해서 면적을 구하면 된다.

def solution(sizes):
    w = [sizes[i][0] for i in range(len(sizes))]
    h = [sizes[i][1] for i in range(len(sizes))]
    max_w, max_h = max(w), max(h)
    if max_w > max_h:
        total_max = max_w   
        for i in range(len(sizes)):
            if sizes[i][1] > sizes[i][0]:
                w[i], h[i] = h[i], w[i]
        max_h = max(h)
        answer = max_h * total_max
    else:
        total_max = max_h
        for i in range(len(sizes)):
            if sizes[i][0] > sizes[i][1]:
                h[i], w[i] = w[i], h[i]
        max_w = max(w)
        answer = max_w * total_max
    return answer

처음으로 바로 통과가 되었다 ㅠ
사실 처음에 완전 탐색이라길래 백트래킹을 생각해야하나, dfs를 써야하나 별 생각을 다했는데 그냥 쉽게 생각하면 바로 풀리는 거였다.

(+) 좀 더 코드를 잘 정리할 순 없을까 싶어서 한번 찾아보았다.
굳이 w,h 리스트를 만들어서 max를 찾고...... 이렇게 할 필요는 없다. 해당 과정을 과감히 삭제하고
스왑 과정을 살린 다음, max함수를 때려버리면 된다.

def solution(sizes):
    r, c = 0,0
    for row, col in sizes:
        if row > col:
            row, col = col, row
        r = max(r, row)
        c = max(c, col)
    return r*c

내가 너무 단순하게 생각했다. 스왑할 때 리스트 요소를 직접 스왑해야한다고 생각했는데, 굳이 직접 스왑안하고 그냥 변수로써 임시저장 느낌으로 스왑을 해주고 max 함수를 통해 최대를 계속 구하기만 하면 되는 거였다.
이러니 코드가 훨씬 깔끔해졌다

profile
https://source-coding.tistory.com/

0개의 댓글