우당탕탕 개발_𝒍𝒐𝒈

<프로그래머스>Lv_0 짝수의 합 본문

𝐬𝐭𝐮𝐝𝐲/𝐚𝐥𝐠𝐨𝐫𝐢𝐭𝐡𝐦

<프로그래머스>Lv_0 짝수의 합

hojeong01 2024. 5. 26. 16:11

<문제>

정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을. return 하도록 solution 함수를 작성해주세요.

 

<나의 풀이>

  • 정수 n이하의 짝수 값을 구하여 공간의 제약이 없는  ArrayList에 담기
  • 짝수값을 구하기 위해 n % 2 ==0
  • ArrayList를 Array로 변경 후 배열의 총합(total) return하기 
public static int Solution(int n) {
    ArrayList<Integer> sum = new ArrayList<>();
    int total = 0;

    for (int i = 0; i <= n; i++) {
        if (i % 2 == 0) {
            sum.add(i);
        }
    }

    int[] array = sum.stream().mapToInt(Integer::intValue).toArray();

    for (int i = 0; i < array.length; i++) {
        total += array[i];
    }

    return total;
}

// 실행시간
// n = 100000
// 실행시간(ms) : 10

 

어제 '평균값 구하기' 때 사용했던 배열의 총합 구하는 방법을 복습하여 문제를 풀어보고 싶은 마음이 있었다. 

더보기

int a =0;

 

a += arry[i] == a= a+arry[i]_

 

<다른 사람의 풀이>

import java.util.stream.IntStream;

class Solution {
    public int solution(int n) {
        return IntStream.rangeClosed(0, n)
                .filter(e -> e % 2 == 0)
                .sum();
    }
}

// 실행시간
// n = 100000
// 실행시간(ms) : 5

 

 <해설해보기>

  • IntStream. range vs IntStream.rangeClosed : 두 메서드 모두 시작값과 종료값을 인자로 받지만 인자값에 종료값의 포함 여부 차이가 있다. 즉  IntStream.rangeClosed (0, n)은 0부터 n까지 종료값까지 인자값으로 가져오게 된다. 
  • Stream에서 원하는 요소를 선택하여 새로운 Stream을 생성해준다. 
  • .sum()을 통해 합계를 구한다. 

 

<느낀점>

'나의 풀이'에서 굳이 굳이 for문을 두번 쓰고 stream을 배열로 변환하지 않아도 되었지만.. 배열의 전체 합 구하기 복습을 해보고 싶은 마음에 시간복잡도 측면에서 엄청 비효율적인 코드가 탄생해버렸다....

덕분에 for문 대신  IntStream. range 을 사용하여 인자를 담는 방법이 이런 유형의 문제에서는 시간복잡도 측면에서 매우 효율적인 것을 알게 되었다. 

다음번에 비슷한 유형의 문제를 만나면 꼭 사용해 보자:)