[프로그래머스/Java] Lv.0 2의 영역

febCho·2024년 3월 9일
0

코딩테스트

목록 보기
59/253
post-thumbnail

문제

정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.

단, arr에 2가 없는 경우 [-1]을 return 합니다.

- 제한사항

  • 1 ≤ arr의 길이 ≤ 100,000
  • 1 ≤ arr의 원소 ≤ 10

풀이

- 오답

처음에는 정수형 배열을 문자열로 만든 다음 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;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글