[오늘의 문제] 최댓값 만들기 (2)

shlim55·2025년 10월 20일

코딩테스트

목록 보기
154/223

출처: 문제 설명
정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

제한사항
-10,000 ≤ numbers의 원소 ≤ 10,000
2 ≤ numbers 의 길이 ≤ 100
입출력 예
numbers result
[1, 2, -3, 4, -5] 15
[0, -31, 24, 10, 1, 9] 240
[10, 20, 30, 5, 5, 20, 5] 600
입출력 예 설명
입출력 예 #1

두 수의 곱중 최댓값은 -3 * -5 = 15 입니다.
입출력 예 #2

두 수의 곱중 최댓값은 10 * 24 = 240 입니다.
입출력 예 #3

두 수의 곱중 최댓값은 20 * 30 = 600 입니다.

내가 작성한 코드문

def solution(numbers):
    answer = 0
    max = -float('inf')
    for i in range (len(numbers)): 
        number1 = numbers[i]
        for j in range(i + 1, len(numbers)): # 이래야 중복 안되게 곱한다. 
            number2 = numbers[j]
            if number1 * number2 > max:
                max = number1 * number2
           
    return max

트러블 슈팅
첫번째로 아직 파이썬 문법이 눈에 안익고, 활용이 힘들었다.

두번째로 범위 설정이 힘들었다.
맨처음에는 중복되는 원소끼리 곱해져서 16이 최댓값 이런식으로 나왔는데
자바처럼 능숙하게 범위 설정이 안됐다.

세번째로 max = 0 했을때 통과가 안되었다.
max = 0으로 초기값을 설정했을 때 생길 수 있는 가장 큰 문제점은 두 수의 곱의 최댓값이 음수일 경우 그 값을 정확히 찾지 못하고 0을 반환하게 된다는 것

네번째 TypeError: 'str' object cannot be interpreted as an integer
에러도 떴다.
range(start, stop, step) 함수는 정수(integer) 인자만 받는다는 뜻. 맨첨에 len함수를 안 넣었다.

다른사람의 풀이

def solution(numbers):
    numbers = sorted(numbers)
    return max(numbers[0] * numbers[1], numbers[-1]*numbers[-2]) 

가장 작은 두 수를 곱한 값과 가장 큰 두 수를 곱한 값 중에 가장 큰 수가 나올 수밖에 없음 따라서, 맨 앞/뒤 두 수를 곱하기 전 크기순으로 정렬함
numbers.sort() 도 가능

from itertools  import combinations as comb

def solution(numbers):
    an_list=[]
    for i,j in comb(numbers,2):
        an_list.append(i*j)
    return max(an_list)

itertools.combinations(numbers, 2)를 사용하여 단 한 줄의 코드로 모든 가능한 두 수의 쌍을 얻는다.

모든 곱을 일단 an_list에 저장한 후, 마지막에 max(an_list) 함수를 호출하여 리스트 내의 실제 최댓값을 찾는다.

제미나이가 알려준 더 간결한 방식

from itertools import combinations

def solution_optimized(numbers):
    # 모든 두 수의 곱을 계산하고 그 중 최댓값을 즉시 반환
    return max(i * j for i, j in combinations(numbers, 2))
profile
A Normal Programmer

0개의 댓글