정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.
단, arr에 2가 없는 경우 [-1]을 return 합니다.
처음에는 정수형 배열을 문자열로 만든 다음 indexOf()와 lastIndexOf()를 통해 제일 첫 위치의 인덱스와 제일 마지막 위치의 인덱스를 구하려고 했다.
그렇게 인덱스 범위를 정한 다음 루프를 돌며 값을 담으려고 했는데 아래와 같은 에러가 났다.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 3
화가 마이 나..
생각해 보니 2가 없을 경우 -1을 return하는 메서드 특성을 고려하지 못하고 for문에 넣어 루프를 돌린 거다. 그래서 좀 더 쉽게 2의 인덱스 값을 구하는 방법을 생각해 보았다.
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
List<Integer> list = new ArrayList<>();
int firstIdx = Arrays.toString(arr).indexOf(2);
int LastIdx = Arrays.toString(arr).lastIndexOf(2);
for(int i=firstIdx;i<=LastIdx;i++){
list.add(arr[i]);
}
int[] answer = new int[list.size()];
for(int i=0;i<list.size();i++){
answer[i] = list.get(i);
}
return answer;
}
}
내가 아이디어를 얻은 건 토글이었다. 앞서 언급한 메서드를 쓸 필요 없이 firstIdx와 lastIdx를 -1로 초기화한 뒤, arr 길이 만큼 루프를 돌며 int[] arr의 값이 2인 순간 두 변수의 값을 변경해 주었다.
여기서 핵심이 되는 부분은 firstIdx가 여전히 -1이라면, firstIdx를 먼저 i (arr[i] == 2인 첫 위치)로 바꾸어 주고 그 이후에는 2가 등장할 때마다 lastIdx를 변경해 준다는 점이다. 모든 2를 포함해야 하기 때문에 lastIdx 값을 계속 변경할 수가 있는 것이다.
그 다음엔 2가 없는 경우, 2가 하나인 경우, 2가 둘 이상인 경우 3가지로 나누어 arr[i] 값들이 담긴 배열을 반환해 주면 된다.
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
List<Integer> list = new ArrayList<>();
int firstIdx = -1;
int lastIdx = -1;
for(int i=0;i<arr.length;i++) {
if (arr[i] == 2) {
if (firstIdx == -1) {
firstIdx = i;
}
lastIdx = i;
}
}
if(firstIdx != -1 && lastIdx != -1) {
for (int i = firstIdx; i <= lastIdx; i++) {
list.add(arr[i]);
}
} else if (firstIdx != -1 && lastIdx == -1) {
return new int[]{arr[firstIdx]};
} else {
return new int[]{-1};
}
int[] answer = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
