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();
}
}
[풀이과정]
- 배열을 ArrayList로 변환한다.
- 역순 정렬을 해줄 Collections.reverse(리스트)의 매개변수가 List 타입 이므로.
- Collections.reverse(리스트) 를 통해 역순으로 정렬한다.
- Stream의 mapToInt()를 통해 리스트 요소를 int로 변경한다.
- 4번에서 사용된 toArray()는 기본적으로 Object[] 타입으로 반환하기 때문.
- 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 |