1. 내 코드
def solution(sizes):
answer = 0
w, h = 0, 0
for card in sizes:
# 카드의 w, h 를 오름차순으로 정렬
card.sort()
# w, h 각각의 최댓값을 변수로 할당
if card[0] > w:
w = card[0]
if card[1] > h:
h = card[1]
# w, h의 최댓값을 곱해 최소한의 크기를 반환
return w * h
직관적이고 명확하지만,
sort() 를 굳이 쓰지 않아도 되는 부분에서 사용해서 다소 비효율적이다.
간단한 정렬은 조건문으로 처리하자!!
2. 다른 사람 풀이
def solution(sizes):
return max(max(x) for x in sizes) * max(min(x) for x in sizes)
가장 간결하고 효율적이다.
1. sizes = [[10, 20], [30, 40], [50, 60]]
2. for 문으로 sizes 배열에서 값을 하나 꺼내온다. -- [10, 20]
3. 그 값 중 최댓값을 꺼낸다. -- max(10, 20) = 20
4. sizes 배열을 돌며 각 값들의 최댓값을 구해서 모은다. -- max(20, 40, 60) = 60
5. 같은 순서로 sizes 배열을 돌며 각 값들의 최솟값을 구해서 모은다. -- max(10, 30, 40) = 40
6. 그 둘의 곱을 반환한다.
max(max()) 구조도 처음 봤고,
max(iterable) 에 for 문을 넣을 수 있는 것도.. 분명 알고는 있었던 거 같은데
이번에는 왜 생각을 못했는지! 아쉽다!
너무 '정렬' 에만 꽂혀있었던듯!
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
직관적이고 효율적이다.
굳이 sort 를 쓸 필요 없이 조건문으로 간단하게 정렬한 부분이 인상깊다.
solution = lambda sizes: max(sum(sizes, [])) * max(min(size) for size in sizes)
sizes = [[10, 20], [30, 40]]
sum(sizes, []) # Flattens to [10, 20, 30, 40]
왜 이 코드에 sum() 이 등장하나 했더니, 리스트 속 리스트를 평탄화하는, 즉, 리스트끼리의 덧셈 용으로 쓰였다.
sizes 의 모든 숫자 중 가장 큰 숫자를 구하고 <- 평탄화
sizes 속 값의 가장 작은 수 중 가장 큰 수를 구해서 서로 곱한다..
** 리스트 병합
A.extend(B)
: 가장 효율적이다. 기존 리스트 A의 값이 변형된다.
: O(B)
A + B (Concatenation)
: 리스트가 병합될 때마다 새로운 리스트가 만들어져 약간의 오버헤드가 발생한다.
: O(B)
sum(List, [])
: sum() 은 리스트에 최적화되어있지 않아서 병합 목적으로 사용하면 다른 메서드보다 느리고 오버헤드가 많이 발생한다.
: 병합될 때마다 새로운 리스트가 만들어진다.
: O(List)
https://blockdmask.tistory.com/558
[python] 파이썬 리스트 합치기 (+, extend, sum)
안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 리스트를 합치는 방법에 대해서 알아보겠습니다. 1. +로 리스트 합치는 방법 2. extend로 리스트 합치기 3. sum으로 이중 리스트 합치기 1. 파이썬 리
blockdmask.tistory.com