여러가지/알고리즘 & 자료구조

[프로그래머스] 평균 구하기

hyeseong-dev 2024. 10. 13. 11:56

평균 구하기 - 알고리즘 문제 풀이 (Java & Python)

이번 글에서는 정수로 이루어진 배열 arr의 평균값을 구하는 문제를 풀어보겠습니다. Java와 Python으로 문제를 해결해보고, 각각의 풀이 방법에 대한 시간 및 공간 복잡도를 분석한 후, 다양한 Java 풀이 방법과 그에 대한 비교를 설명드리겠습니다.

문제 설명

정수를 담고 있는 배열 arr의 평균값을 반환하는 solution 함수를 구현하세요.

제한사항

  • arr은 길이 1 이상, 100 이하인 배열입니다.
  • arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.

입출력 예

arr 결과
[1, 2, 3, 4] 2.5
[5, 5] 5

입출력 예 #1: [1, 2, 3, 4]의 평균값은 (1 + 2 + 3 + 4) / 4 = 2.5입니다.
입출력 예 #2: [5, 5]의 평균값은 (5 + 5) / 2 = 5입니다.

해결 방법

이 문제를 해결하기 위해 배열의 모든 원소를 합한 후, 배열의 길이로 나누어 평균값을 계산합니다. 각각의 언어(Java, Python)로 코드와 설명을 제공하며, 시간 및 공간 복잡도를 분석하겠습니다.

Python 코드

def solution(arr):
    # 배열의 합을 계산한 후, 배열의 길이로 나누어 평균값 반환
    return sum(arr) / len(arr)
시간 및 공간 복잡도
  • 시간 복잡도: O(n) - 배열의 모든 원소를 순회하며 합을 계산해야 하므로, 배열의 길이 n에 비례하는 시간이 소요됩니다.
  • 공간 복잡도: O(1) - 추가적인 배열이나 리스트를 사용하지 않고, 상수 개수의 변수를 사용하므로 공간 복잡도는 상수입니다.

Java 코드

class Solution {
    public double solution(int[] arr) {
        int sum = 0;
        for (int num : arr) {
            sum += num;
        }
        return (double) sum / arr.length;
    }
}
시간 및 공간 복잡도
  • 시간 복잡도: O(n) - 배열의 모든 원소를 순회하며 합을 계산해야 하므로, 배열의 길이 n에 비례하는 시간이 소요됩니다.
  • 공간 복잡도: O(1) - 추가적인 배열이나 리스트를 사용하지 않고, 상수 개수의 변수를 사용하므로 공간 복잡도는 상수입니다.

다양한 Java 풀이 방법 소개

위의 기본 풀이 외에도 자바에서는 다양한 방법으로 이 문제를 해결할 수 있습니다. 몇 가지 추가적인 풀이 방법을 살펴보겠습니다.

1. Stream API 사용

Java 8 이상의 버전에서는 Stream API를 이용하여 간결하게 문제를 해결할 수 있습니다.

import java.util.Arrays;

class Solution {
    public double solution(int[] arr) {
        return Arrays.stream(arr).average().orElse(0);
    }
}
설명
  • Stream 사용: Arrays.stream(arr)를 통해 배열을 스트림으로 변환하고, average() 메서드를 이용해 평균값을 계산합니다.
  • 간결함: 코드가 간결하며 직관적입니다.
장점 및 단점
  • 장점: 코드가 간결하고, 함수형 스타일로 작성되어 가독성이 높습니다.
  • 단점: 작은 배열에서는 성능 차이가 없지만, 스트림 사용에 따른 약간의 성능 오버헤드가 발생할 수 있습니다.

비교 및 결론

  • 기본 for 루프 사용: 가장 직관적이며 간단한 방법으로, 배열의 크기가 작을 때 유리합니다.
  • Stream API 사용: 함수형 프로그래밍 스타일로 코드가 간결하며 가독성이 높지만, 내부적으로 반복자를 사용하므로 성능 오버헤드가 발생할 수 있습니다.

문제의 제한 조건(배열의 길이가 최대 100)에 비추어 볼 때, 각 방법의 성능 차이는 거의 없으며, 개인의 선호도와 코드 스타일에 따라 선택하면 됩니다. 간결한 코드를 원한다면 Stream API를, 명시적인 반복문을 선호한다면 기본 for 루프를 사용하는 것이 좋습니다.

이 글을 통해 배열의 평균값을 구하는 문제를 다양한 방식으로 해결해 보았습니다. 여러분의 상황에 맞는 방법을 선택하여 효율적으로 문제를 해결해 보세요! 😊