Coding Test/Programmers

[Lv.0] 최댓값 만들기(1) [프로그래머스_코딩테스트] [정렬, 수학] [10분]

whawoo 2025. 6. 22. 15:05
반응형

🔍 문제 요약

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

 

프로그래머스

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

programmers.co.kr

숫자들이 들어있는 numbers가 주어지고 해당 원소 중 두개를 곱해서 최댓값을 구하는 문제

🧠 나의 접근 방식과 시행착오

1분에 푼 문제. 그냥 내림차순 정렬하고 0, 1번 항목을 곱하면 된다. 사실상 가장 간단하게 푼 방법. O(NlogN)

/// <summary>
/// 최댓값 만들기(1)
/// https://school.programmers.co.kr/learn/courses/30/lessons/120847
/// </summary>
public int solution(int[] numbers)
{
    // 그냥 내림차순 정렬 후 0, 1번 항목을 구하면 됨...
    Array.Sort(numbers);
    Array.Reverse(numbers);

    return numbers[0] * numbers[1];
}

✅ 풀이 코드

푸는 방법 중 다른 방법인 하나로 시간 복잡도를 O(N) 가독성이 좀 떨어지나 시간 복잡도는 좀 더 좋은 방향. numbers를 한 번만 순회하는 방법인데 생각지 못한 방법이긴 했다. max1을 max2로 밀어 넣고 max1에 num을 넣고 max2에 넣는 방법. 로직을 보고 생각의 흐름을 맡기려고 하면 조금 복잡해지는 느낌이 들긴 한다. 유지보수에 그래서 좋지 못한 단점이 있는 듯 한 방법. 효율로는 좀 뒤쳐져도 역시 이번 문제에서는 위의 NlogN으로 하는 방향이 낫지 않을까 싶다.

public int solution(int[] numbers)
{
    int max1 = 0, max2 = 0;

    foreach (int num in numbers)
    {
        if (num > max1)
        {
            max2 = max1;
            max1 = num;
        }
        else if (num > max2)
        {
            max2 = num;
        }
    }

    return max1 * max2;
}

🔄 정리

문제 자체가 어려운 편은 아니었으나 피드백으로 준 O(N)의 방법도 로직적으로 효율이 좋으니 생각은 해두고 나중에 써먹을 수 있어도 좋을 듯 하다

반응형