byworld 님의 블로그

20260430 프로그래머스 최댓값 만들기(2) 본문

TIL

20260430 프로그래머스 최댓값 만들기(2)

byworld 님의 블로그 2026. 5. 2. 04:55

[서론]

쉬운 문제지만 나보다 시간 효율적인 다른 사람 코드가 안보여서 가져왔다.

 

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[오늘의 추천곡] 체리필터 - 낭만고양이

나는 낭만이 실용보다 중요하다고 생각하는 사람이다. 뭐 낭만이 아니라 충동이라고 할 수도 있다. 물론 대부분의 일을 실용 기준으로 하긴 하지만... 다 먹고 살자고 하는 것 아닌가? 돈도 솔직히 별로 연연하지는 않다. 주식을 해서 그런가 얼마 벌고 잃고 하는 것에 감정적 관심이 없다. 세상이 가짜같아 보이기도 하고. 그냥 내 맘대로 살거다. Follow your heart!!

 

https://youtu.be/h3XVYav2SQs?list=RDh3XVYav2SQs

 

 

 

[문제 풀이]

쉬운 문제지만 나보다 시간 효율적인 다른 사람 코드가 안보여서 가져왔다. 내 코드는 이러하다.

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> numbers) {
    int answer = 0;
    int max=-100000;int smax=-99999;
    int min=100000;int smin=99999;
    
    for(int k:numbers){
        if(k>max){
            smax=max;
            max=k;
        }else if(k>smax){
            smax=k;
        }
        
        if(k<min){
            smin=min;
            min=k;
        }else if(k<smin){
            smin=k;
        }
    }
    return min*smin>max*smax?min*smin:max*smax;
}

 

발상은 이렇다. 두 수를 곱해서 최대를 만들려면 가장 큰 두 수를 곱하거나 가장 작은 두 수를 곱해야한다.

이 중에서 의문점이 있을 수 있는 게 음수가 하나라면? 음수에 양수나 0에서 가장 작은 것을 곱해야 가장 큰 곱이 나오니까, 결국 가장 작은 두 개를 곱하면 된다. 결국 내 발상 대로 하면 된다. 

그러면 어떻게 가장 큰, 가장 작은 두 수를 구할건가? 코드에서 있다시피 기존 min, max를 구하고, smin, smax로 세컨드를 만들어서 민맥스가 나오면 sminmax는 minmax를 받아오고, minmax보다 작거나 같은 값이라면 sminmax에 해당 숫자를 대입하면 된다. 또 의문점이 중복되는 값이면 어쩌나? 부등호 조건 맞나 할 수 있다. 예를 들어 [5,5,-1] 같은 숫자는 안되지 않나? 결론은 된다. 왜냐하면 else if k>max에서 중복되어도 받아주기 때문이다. 나는 max() 함수 대신 삼항 연산자로 return을 했다.

 

다른 사람이 푼 예시 코드는 이렇다.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> numbers) {
    sort(numbers.begin(),numbers.end());    
    int n = numbers.size();
    return max(numbers[n-1]*numbers[n-2],numbers[0]*numbers[1]);
}

 

겉보기에는 더 간단하지만 시간 복잡도는 내가 더 좋다. 왜냐하면 이 코드는 sort를 하기 때문이다. O(nlogn) 시간이 걸린다. 나는 O(n) 시간에 풀었다. 사실 프로그래머스에서는 시간 복잡도를 잘 안따지는 것 같고 효율보다 가독성이 더 좋은 코드를 선호하는 것 같긴 하다. 내 코드도 뭐 숫자 개판이고 가독성 개판이고 하지만 귀찮아서 이대로 할거다.