문제 설명
정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.
단, arr에 2가 없는 경우 [-1]을 return 합니다.
제한사항
1 ≤ arr의 길이 ≤ 100,000 1 ≤ arr의 원소 ≤ 10
나의 코드
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
List<Integer> list = new ArrayList<>();
for(int i=0; i<arr.length; i++) {
if(arr[i]==2) {
list.add(arr[i]);
for(int j=i+1; j<arr.length-i+1; j++) {
if(arr[j]==2) {
break;
}
list.add(arr[j]);
}
}
}
if(list.isEmpty()) {
list.add(-1);
}
int[] answer = new int[list.size()];
for(int k=0; k<list.size(); k++) {
answer[k] = list.get(k);
}
return answer;
}
}
4개 중에 3개 성공. arr
의 원소에 2가 한 번만 나올 경우 에러가 발생
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
List<Integer> list = new ArrayList<>();
for(int i=0; i<arr.length; i++) {
if(arr[i]==2) {
list.add(arr[i]);
for(int j=i+1; j<arr.length-i+1; j++) {
if(arr[j]==2) {
break;
}
list.add(arr[j]);
}
}
}
if(list.isEmpty()) {
list.add(-1);
} else if(list.get(list.size()-1)!=2) {
list.clear();
list.add(2);
}
int[] answer = new int[list.size()];
for(int k=0; k<list.size(); k++) {
answer[k] = list.get(k);
}
return answer;
}
}
코드 실행
은 다 통과하였지만, 제출 후 채점하기
에서 2개만 통과,, 통과하기에만 급급한 코드라 근본적인 문제를 해결하지 못했다.
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
int firstIndex = -1;
int lastIndex = -1;
for(int i=0; i<arr.length; i++) {
if(arr[i]==2) {
firstIndex = i;
break;
}
}
if(firstIndex != -1) {
for(int j=firstIndex; j<arr.length; j++) {
if(arr[j]==2) {
lastIndex = j;
}
}
}
List<Integer> list = new ArrayList<>();
if(firstIndex == -1) {
list.add(-1);
} else if(firstIndex == lastIndex) {
list.add(2);
} else {
for(int k=firstIndex; k<=lastIndex; k++) {
list.add(arr[k]);
}
}
int[] answer = new int[list.size()];
for(int x=0; x<list.size(); x++) {
answer[x] = list.get(x);
}
return answer;
}
}
근본적인 문제 해결을 위해 초기화를 하고 코드를 새로 짰다.
상황은 3가지
1. 요소에 2가 없는 경우
2. 요소에 2가 1개일 경우
3. 요소에 2가 여러 개라 범위를 정할 수 있는 경우
3가지로 나누어 각각의 조건문을 통해 문제를 해결
느낀 점
처음에 사이값을 추가할 firstIndex
와 lastIndex
를 선언하고 반복문을 돌며 조건을 달아 해결하는 방법을 떠올리지 못했다. 문제 해결을 위한 하나하나 코드를 짜는 것보다 전체적인 틀을 짜서 문제를 해결하는 법을 길러야함을 뼈져리게 느낀다.