https://school.programmers.co.kr/learn/courses/30/lessons/181894
문제
💭 나의 생각
주어진 배열 안에서 2가 모두 포함된 부분 배열을 return 하는 문제이다.
나는 주어진 배열에서 숫자 "2"를 찾고, "2"를 발견할 때마다 해당 "2"를 포함한 그 이후의 연속적인 숫자들을 ArrayList인 list에 추가해 주었다.
💻 나의 코드
import java.util.ArrayList;
class Solution {
public int[] solution(int[] arr) {
// 결과를 저장할 ArrayList 객체 생성
ArrayList<Integer> list = new ArrayList<>();
// 배열 arr을 반복하여 숫자 2를 찾음
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 2) {
// 숫자 2를 list에 추가
list.add(arr[i]);
// 숫자 2 다음의 연속된 숫자들을 저장하기 위한 ArrayList 객체 생성
ArrayList<Integer> subList = new ArrayList<>();
// 현재 위치(i) 다음 인덱스부터 배열을 다시 순회하여 연속된 숫자들을 subList에 추가
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] == 2) {
// 다시 숫자 2를 발견하면 subList를 list에 추가하고 반복 종료
list.addAll(subList);
break;
} else {
// 숫자 2가 아닌 경우 subList에 숫자 추가
subList.add(arr[j]);
}
}
}
}
// list가 비어있을 경우 -1을 추가
if (list.isEmpty()) {
list.add(-1);
}
// ArrayList를 기본형 배열로 변환하여 반환
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
🔎 다른 사람의 코드에서 배운 것
import java.util.stream.IntStream;
class Solution {
public int[] solution(int[] arr) {
int[] idxs = IntStream.range(0, arr.length).filter(i -> arr[i] == 2).toArray();
if(idxs.length == 0) {
int[] zero = {-1};
return zero;
}
else if(idxs.length == 1) {
int[] one = {2};
return one;
}
else {
return IntStream.rangeClosed(idxs[0], idxs[idxs.length - 1]).map(i -> arr[i]).toArray();
}
}
}
IntStream을 활용하여 숫자 "2"가 나온 인덱스를 배열에 저장해서,
- 배열 길이가 0이면, 숫자 2가 없는 경우이므로 -1을 반환
- 배열 길이가 1이면, 숫자 2가 한 번만 나타나는 경우이므로 2를 반환
- 배열 길이가 2 이상인 경우, idxs[0]는 첫 번째로 나타나는 2의 인덱스를 idxs[idxs.length-1]는 마지막으로 나타나는 2의 인덱스를. 이렇게 구한 인덱스 범위 내의 원소들을 새로운 배열로 반환
- IntStream.rangeClosed() - 끝 숫자를 포함
- IntStream.range() - 끝 숫자를 포함하지 않음