포시코딩

[프로그래머스][Lv.0] 최댓값 만들기 (2) 본문

자료구조알고리즘/문제풀이

[프로그래머스][Lv.0] 최댓값 만들기 (2)

포시 2023. 1. 3. 10:12
728x90

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 풀이 A

def solution(numbers):
    numbers.sort()
    return numbers[-1]*numbers[-2]

간단한 문제인줄 알았는데 numbers의 범위를 생각하지 못했다.

  • -10,000 ≤ numbers의 원소 ≤ 10,000

두 음수의 합도 제일 큰 수가 될 수 있다는걸 생각하지 못했기 때문에 이 방법은 바로 폐기

 

내 풀이 B

def solution(numbers):
    max = numbers[0]*numbers[1]  # 수정전에는 max = 0
    numbers.sort()
    for i in range(len(numbers)):
        for j in range(i+1, len(numbers)):
            if max < numbers[i]*numbers[j]:
                max = numbers[i]*numbers[j]
    return max

정렬하듯 두 수를 하나하나 곱해 최대값을 구했는데

max의 초기값을 0으로 지정한게 큰 실수였다.

 

numbers에서 두 수의 합이 0보다 작은 경우도 있다는걸 간과했기에

한참을 찾다 결국 다른 사람들의 도움을 받았다.

  • 2 ≤ numbers 의 길이 ≤ 100

numbers의 길이는 2 이상이기에 0, 1 인덱스를 먼저 곱해 초기값을 정하게끔 변경하니 잘 되는것을 확인

 

다른 풀이

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

마지막 두 수의 곱이 제일 큰 수가 아닌 경우는 두 음수의 곱이라는 얘기인데 

정렬했을 때 처음 두 수가 제일 낮은 즉, 곱했을 때 제일 큰 수가 되므로 

이 방법은 내 풀이처럼 이중for문도 쓰지 않기 때문에 아주 좋은 풀이 방법으로 보인다.

728x90