코딩테스트 - 프로그래머스/Lv. 0

[34] JAVA 배열 뒤집기

유혁스쿨 2023. 11. 16. 15:30
728x90
반응형

문제 설명
머쓱이는 40살인 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 나이 age가 주어질 때, 2022년을 기준 출생 연도를 return 하는 solution 함수를 완성해주세요.

제한사항

  • 0 < age ≤ 120
  • 나이는 태어난 연도에 1살이며 1년마다 1씩 증가합니다.


입출력 예

age result
40 1983
23 2000


입출력 예 #1

  • 2022년 기준 40살이므로 1983년생입니다.

입출력 예 #2

  • 2022년 기준 23살이므로 2000년생입니다.

[나의 풀이]

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

class Solution {
    public int[] solution(int[] num_list) {
        List<Integer> collect = Arrays.stream(num_list)
            .boxed()
            .collect(Collectors.toList());
        Collections.reverse(collect);
        return collect.stream().mapToInt(value -> (int) value).toArray();
    }
}

 

[풀이과정]

  1. 배열을 ArrayList로 변환한다.
    • 역순 정렬을 해줄 Collections.reverse(리스트)의 매개변수가 List 타입 이므로.
  2. Collections.reverse(리스트) 를 통해 역순으로 정렬한다.
  3. Stream의 mapToInt()를 통해 리스트 요소를 int로 변경한다.
    •  4번에서 사용된 toArray()는 기본적으로 Object[] 타입으로 반환하기 때문.
  4. toArray()를 통해 배열로 변환한다.

 

[리팩토링] Integer.intValue()

3번의 mapToInt()에서 강제 형변환 대신 Integer의 intValue()함수를 활용한다.

.mapToInt(Integer::intValue)

 

 

+ mapToInt자체가 기존 value를 그대로 반환해주면 Object타입을 int로 변경시켜주기 때문에 (int)를 지워도 된다. 

이것은 mapToLong() 등 에서도 똑같이 적용할 수 있다.

이렇게 되면 mapToInt( Integer::intvalue ) 의 Integer::intvalue는 불필요한 메모리를 사용하는 셈이 된다.

.mapToInt(value -> value)

 

단, 기준이 되는 value값을 연산으로 사용하게 되면  문제가 발생할 수 있다.

예를들면 아래의 다른 풀이에서 처럼 인덱스에서 value값을 사용한다면 변환되기 전이므로 인덱스에 long타입 값이 들어가게 된다..


[다른 풀이]

import java.util.stream.LongStream;

class Solution {
    public int[] solution(int[] num_list) {
        return LongStream.range(1, num_list.length + 1)
                .mapToInt(i -> num_list[(int) (num_list.length - i)])
                .toArray();
    }
}
  • LongStream의 range를 통해 1 부터 길이만큼 1씩 증가하는 정수를 수집한다.
  • mapToInt()를 통해 이전에 수집한 정수 각각에 매핑하여 순차적으로 반환한 결과값을 지니고있는 스트림을 반환한다.
    • num_list의 인덱스를 역순으로 설정한 뒤 순차적으로 줄여가며 반환받는다.
    • LongStream이므로 i가 Long타입 이므로 인덱스 연산에서 Long으로 적용된다.
      • mapToInt()를 사용하여 int로 변환한다.
  • toArray를 통해 배열로 변경한다.

 

[리팩토링] LongStream -> IntStream

 

위 코드를 리팩토링 한다면 아래 코드와 같이 LongStream대신 IntStream을 사용할 수도 있다.

 

import java.util.stream.LongStream;

class Solution {
    public int[] solution(int[] num_list) {
        return IntStream.range(1, num_list.length + 1)
                .map(i -> num_list[(num_list.length - i)])
                .toArray();
    }
}

 

mapToInt()였던 작업을 map()으로 수행함으로써 불필요한 강제 타입캐스팅을 진행하지 않게 된다.

728x90
반응형

'코딩테스트 - 프로그래머스 > Lv. 0' 카테고리의 다른 글

[36] JAVA 최대값 만들기(1)  (0) 2023.11.16
[35] 부분 문자열  (0) 2023.11.16
[33] JAVA 편지  (0) 2023.11.16
[32] JAVA 양꼬치  (0) 2023.11.16
[31] JAVA 배열의 평균 값  (0) 2023.11.16