KDLiam

[Programmers 코딩 기초 트레이닝 : Java] 원소들의 곱과 합 본문

Problems(Java)/Programmers

[Programmers 코딩 기초 트레이닝 : Java] 원소들의 곱과 합

KDLiam 2025. 10. 1. 17:21

➗ 합의 제곱 vs 곱 (프로그래머스 181929번)

📌 문제 링크: 프로그래머스 181929 - 합의 제곱과 곱 비교하기


📖 문제 설명

정수 배열 num_list가 주어졌을 때,

  • 모든 원소의
  • 모든 원소의 합의 제곱
    을 비교하여 곱이 크면 0, 합의 제곱이 크거나 같으면 1을 반환하는 문제입니다.

✨ 첫 번째 풀이 (기본 방식)

 
class Solution {
    public int solution(int[] num_list) {
        
        int all_multiply = 1;
        int square_of_all_sum = 0;
        
        for(int n : num_list) {
            all_multiply *= n;
            square_of_all_sum += n;
        }
        
        int answer = all_multiply > Math.pow(square_of_all_sum, 2) ? 0 : 1;
        return answer;
    }
}
  • Math.pow()를 활용 → 반환형이 double이라 int 비교에 부적절
  • 변수명이 길어서 다소 가독성 떨어짐

✨ 두 번째 풀이 (개선된 방식)

 
 
class Solution {
    public int solution(int[] num_list) {
        int product = 1;
        int sum = 0;

        for (int n : num_list) {
            product *= n;
            sum += n;
        }

        int sumSquared = sum * sum;
        return product > sumSquared ? 0 : 1;
    }
}
  • 변수명을 product, sum, sumSquared로 단순화
  • sum * sum으로 합의 제곱 계산 → int 연산만 사용 → 더 안전

✨ 세 번째 풀이 (Stream API 활용)

 
import java.util.Arrays;

class Solution {
    public int solution(int[] num_list) {
        int product = Arrays.stream(num_list)
                            .reduce(1, (a, b) -> a * b);

        int sum = Arrays.stream(num_list).sum();
        int sumSquared = sum * sum;

        return product > sumSquared ? 0 : 1;
    }
}

💡 특징

  • Arrays.stream(num_list).sum() → 합 구하기 간단
  • reduce(1, (a, b) -> a * b) → 곱 구하기 가능
  • 코드가 함수형 스타일로 깔끔해 보이지만, 내부적으로는 Stream 객체 생성 비용이 있음

📊 효율성 비교

항목for문 풀이Stream 풀이
가독성 직관적 (Java 기본 문법) 함수형 스타일, 간결해 보임
성능 빠름 (O(n)) 약간 느림 (Stream 객체 생성 오버헤드)
실무 활용 기본 for문이 일반적 데이터 처리 파이프라인엔 Stream 유용
코딩테스트 적합성 ✅ 추천 ❌ 비추천 (불필요한 성능 손실)

✅ 정리

  • 이 문제는 단순 반복문만으로 충분
  • **합의 제곱 = sum * sum**으로 처리 → Math.pow() 불필요
  • Stream API는 가독성은 있지만, 코딩테스트에선 비효율적이므로 잘 쓰지 않음