Java | 프로그래머스 입문_짝수는 싫어요 | IntStream, rangeClosed, filter, toArray

박예선·2023년 4월 7일
0

코딩테스트

목록 보기
1/3
post-thumbnail

나는 코딩테스트 문제를 풀고 꼭 다른 사람의 풀이를 보며 내 풀이와 비교해본다.
그리고 아!!! 싶은 것들은 기록을 꼭 해두는 편!
이 포스팅은 코딩테스트 연습을 시작한지 일주일도 안됐을 병아리 시절에
(지금으로부터 약 한달전)(물론 지금도 병아리이긴 함)
기록해놨던 건데 출간을 안해놨길래 늦게라도 정리해본다.

지금봐도 아!싶긴 하다. 아직 Stream을 잘 활용하지 못해서...ㅎㅎ
프로그래머스 다른 풀이들을 보다보면 스트림을 활용하는 경우가 많이 보이는데
완전 병아리 수준인 내가 보기엔 아직 뭔지도 모르겠고 이해하기 힘든게 많다.

하지만 이번엔 나도 충분히 활용가능해보이고, 보기에도 깔끔해서 가져와봤다.
풀이를 보며 어떤 문법을 활용한건지 같이 정리하려 한다.

혹시 잘못된 정보가 있다면 댓글로 알려주세요! 피드백은 사랑입니다😊


문제

문제 링크←
정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.

  • 제한사항
    : 1 ≤ n ≤ 100
  • 입출력 예시
    1) 입력: n= 10 출력: [1, 3, 5, 7, 9]
    2) 입력: n= 15 출력: [1, 3, 5, 7, 9, 11, 13, 15]

내 코드

코딩테스트를 거의 처음 시작할 때라 20분 걸려서 해결했던 코드.
그래도 지금은 이 정도 문제는 바로 해결 가능!👍

import java.util.ArrayList;

class Solution {
    public ArrayList<Integer> solution(int num) {
        ArrayList<Integer> answer = new ArrayList<>();

        for (int i = 0; i < num; i++) {
            if ((i + 1) % 2 != 0) answer.add(i + 1);
        }

        return answer;
    }
}

참고할 만한 풀이

다른 사람들의 풀이 링크 => 문제를 해결한 사람만 그냥 볼 수 있고,
문제 해결하지 않은 상태에서 보면 무슨 점수(?)가 깎인다고 합니다!

import java.util.stream.IntStream;

class Solution {
    public int[] solution(int n) {

        return IntStream.rangeClosed(0, n)
            .filter(e -> e % 2 != 0)
            .toArray();
    }
}

IntStream.rangeClosed(start, end)

  • 특정 범위의 숫자를 차례대로 생성해주는 메서드: 시작값과 종료값을 인수로 받는다.
  • LongStream에서도 같은 역할을 한다.
  • 비슷한 메서드로 IntStream.range가 있다.
    둘의 차이로는 range는 종료값을 포함하지 않고,
    rangeClosed는 종료값을 포함한다.
    따라서 현재 문제상황에서는 rangeClosed를 사용하는 것이 더 가독성이 좋다.

filter(람다식)

  • Stream의 요소들을 말그대로 필터링하는 메서드
  • 작성한 람다식 내의 조건으로 필터링한다.
  • 현재 문제에서는 홀수를 찾아야 함으로 2로 나머지 연산을 했을 때
    0이 아닌 것을 찾아 필터링하고 있다.

toArray()

  • 스트림을 Array(배열로)변환하는 메서드

이렇게 풀이를 하나씩 뜯어봤는데, 스트림을 잘 모르는 내가 봐도
가독성이 좋다고 느낀 풀이였다.
물론 문제가 어려운 문제가 아니라서 그런 것일 수 있지만
다른 분들 풀이에 스트림 나오면 난 모르는거...이러고 넘긴 적도 많은데
스트림에 한발짝 다가가게 해준 풀이다!!!

이렇게 내가 푼 방법과 다른 풀이를 통해 배우는 것 너무 재밌어 👍

profile
개발 좋아 lynn08082@gmail.com

0개의 댓글