카테고리 없음
[프로그래머스] Lv.1 최소 직사각형 (파이썬)
_은선_
2025. 1. 29. 15:50
728x90
SMALL
완전 탐색 문제
https://school.programmers.co.kr/learn/courses/30/lessons/86491
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
💡 풀이코드 (실패 - 시간초과)
import sys
sys.setrecursionlimit(10000000)
result = sys.maxsize
def solution(sizes):
def dfs(idx, w_max, h_max):
global result
if idx == len(sizes):
result = min(result, w_max * h_max)
return
for i in range(2):
n_w_max = max(w_max, sizes[idx][i]) # 0, 1
n_h_max = max(h_max, sizes[idx][1-i]) # 1, 0
if n_w_max * n_h_max < result:
dfs(idx + 1, n_w_max, n_h_max)
dfs(0, 0, 0)
answer = result
return answer
시간 복잡도
시간 복잡도 계산 (카세르트의 곱)
각각의 명함 번호에서 2가지(1. w, h 2. h, w) 의 경우의 수를 만들 수 있고, 이러한 명함 번호를 조합하여 모든 경우의 수를 찾는다.
따라서, 최악의 경우 N = 10,000일 때, 호출 횟수는 O(2**10000)이 되므로 시간 초과가 발생한다.
💡 풀이코드 (실패)
def solution(sizes):
answer = 0
arr = [x for s in sizes for x in s]
arr.sort(reverse=True)
answer = arr[0] * arr[len(arr) // 2]
return answer
명함 번호 | 가로 길이 | 세로 길이 |
1 | 60 | 50 |
2 | 30 | 70 |
3 | 60 | 30 |
4 | 80 | 70 |
위의 예시에서 4번 명함의 세로 길이에 있는 70이 두번째로 큰 수 이지만, 가로 길이로 바꿀 수가 없다 (80이 더 크므로)
따라서, 이러한 경우로 인해 오답이 발생한다.
잘못된 답 : arr = [80, 70, 70, 60, 60, 50, 30, 30] -> 4800
올바른 답 : 가로 = [60, 70, 60, 80] 세로 = [50, 30, 30, 70] -> 5600
💡 풀이코드 (성공)
def solution(sizes):
answer = 0
w_max = max(sizes, key = lambda x: x[0])[0]
h_max = max(sizes, key = lambda x: x[1])[1]
if max(w_max, h_max) == w_max:
for i in range(len(sizes)):
if sizes[i][0] < sizes[i][1]:
sizes[i][1] = sizes[i][0]
h_max = max(sizes, key = lambda x: x[1])[1]
else:
for i in range(len(sizes)):
if sizes[i][0] > sizes[i][1]:
sizes[i][0] = sizes[i][1]
w_max = max(sizes, key = lambda x: x[0])[0]
answer = w_max * h_max
return answer
느낀점
시간복잡도를 미리 계산하고 문제를 풀자 ..!
728x90
LIST