4/26

justyoon·2023년 4월 26일
0

프로그래머스 - 최소직사각형

문제

programmers : 최소직사각형

시도

1

주어진 가로 길이와 세로 길이를
각 길이의 최대로 지갑을 만들면
모든 명함을 수납할 수 있다.

❗배제해야만 하는 조건❗: 다른 명함을 흩트린다든지 하는 조건은 배제한다
(본인은 이거 때문에 해매고나서 문제 피드백에 명확하게 설명이 필요하다고 의견을 남겼다)
그래서 가로길이든 세로길이든 한 방향으로 맞춰준다

# Dummy data for testing
sizes = [[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]]

"""
2차원 배열의 명함크기를 담은 리스트이다. 
긴쪽/짧은쪽으로 배치된 모든 명함을 수납할 수 있는 조건의 지갑크기는 [15,8]길이를 곱한 120임을 알 수 있다.
"""

"""
(흩트리는 조건은 배제했으니)'최대길이 中 최대값'과 '최소길이 中 최대값'만 구하면 
조건을 만족하는 지갑의 크기를 찾을 수 있다. 
sizes들의 최대|최소길이에 해당하는 변수는 x 하나로 선언
"""

def solution(sizes):

    max_length = max(max(x) for x in sizes)

    max_min_length = max(min(x) for x in sizes)

    return max_length * max_min_length
"""    
여기서 x는 max, min함수의 반복가능한 단일 인수이자 
for문을 통해 찾을 명함 크기 sizes (튜플, 문자열 등등 여기선 리스트)에 대입되는 변수이다. 
명함의 큰쪽 길이 中 가장 큰 길이값을 리턴. max(max(x) for x in sizes) 
명함의 작은쪽 길이 中 가장 큰 길이값을 리턴. max(min(x) for x in sizes) 
양 쪽 모든 명함 길이의 사이즈를 수납할 수 있는 지갑의 최대|최소길이 최대값을 찾았으므로 두 길이를 곱한 값을 리턴.
"""
# Call the function and print the result
print(solution(sizes))  # Expected output: 120

def solution(sizes):
    return max(max(x) for x in sizes) * max(min(x) for x in sizes)

사용 개념


2.

lambda식을 사용하여 풀 수 있다고 해서 테스트 해 보았다.
똑같이 최소한으로 모든 명함을 수납할 수 있는 가장 큰 크기를 계산.
map(f, iterable)함수(f)반복 가능한(iterable) 데이터를 입력으로 받는다.
즉 입력받은 데이터의 각 요소에 함수 (f)를 적용한 결과를 리턴하므로
max(map(lambda x: max(x), sizes))
max(map(lambda x: min(x), sizes))
명함 길이 2차원 배열 리스트에서 가장 큰 값, 작은 값을 리턴하면 각각 max를 적용하고 그 값을 리턴한다.

def solution(sizes):
    
    max_length = max(map(lambda x: max(x), sizes))
   
    max_min_length = max(map(lambda x: min(x), sizes))
    
    return max_length * max_min_length
    
"""    
각 명함의 최대 길이 中 최대값을 리턴
각 명함의 최소 길이 中 최대값을 리턴
조건을 만족하는 지갑 크기 반환
""" 

# Dummy data for testing
sizes = [[5, 10], [10, 20], [3, 7], [8, 4], [6, 12]]

# Call the function and print the result
print(solution(sizes))  # Expected output: 200

solution = lambda sizes: max(map(lambda x: max(x), sizes)) * max(map(lambda x: min(x), sizes))

사용 개념


3

2차원 배열 → 1차원 배열 sum(list, [])

풀이2처럼 풀었을 때 lambda식으로 표현하는 장점이 없는 것 같아서 다른 lambda 풀이를 살펴봤다.
이 풀이는 sum(iterable)함수에 두번 째 인자로 주어진 empty list []를 default 값으로 전달해서 sizes 리스트 요소들의 합을 2차원 배열이 아닌 1차원 배열화 하는 것을 이해하는 것이 중요해 보인다.

max함수로 list의 최대길이 최대값과 최소길이 최대값을 리턴받고 곱한다. 앞서 size리스트를 1차원 배열화해 최대길이를 전부 찾아줬기 때문에 뒤에서 최소길이는 for문으로 찾은 것 같다.

solution = lambda sizes: max(sum(sizes, [])) * max(min(size) for size in sizes)

# Dummy data for testing
sizes = [[5, 10], [10, 20], [3, 7], [8, 4], [6, 12]]

# Call the function and print the result
print(solution(sizes))  # Expected output: 200


profile
with gratitude, optimism is sustainable

0개의 댓글