프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 2의 영역(Java)

Sigfriede 2023. 5. 7. 01:20

  문제 설명

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

 

  제한사항

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

 

  입출력 예

arr result
[1, 2, 1, 4, 5, 2, 9] [2, 1, 4, 5, 2]
[1, 2, 1] [2]
[1, 1, 1] [-1]
[1, 2, 1, 2, 1, 10, 2, 1] [2, 1, 2, 1, 10, 2]
import java.util.ArrayList;
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 i = firstIndex; i < arr.length; i++) {
                if (arr[i] == 2) {
                    lastIndex = i;
                }
            }
        }
        
        ArrayList<Integer> list = new ArrayList<>();
        if (firstIndex == -1) {
            list.add(-1);
        } else if (firstIndex == lastIndex) {
            list.add(2);
        } else {
            for (int i = firstIndex; i <= lastIndex; 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;
    }
}

  문제가 다소 모호한 감이 있습니다. 배열의 원소인 2를 가장 많이, 길이는 최소한으로 담는 배열을 반환하는 것입니다.

  2의 위치를 담을 변수 firstIndex와 lastIndex 변수를 생성합니다. 인덱스와 겹치지 않도록 -1로 초기화합니다.

  for문이 arr의 길이만큼 순회합니다. 만약 arr의 i번째 원소가 2라면 firstIndex에 i를 할당하고 즉시 for문을 빠져나옵니다. 연달아 lastIndex를 구할 차례입니다. if문에서 firstIndex가 -1인지 확인합니다. 이는 배열에 2가 있었는지 확인하는 것입니다. 만약 없다면 계산은 불필요합니다. 만약 2가 있다면 for문을 진행합니다. firstIndex부터 시작하여(2가 등장하는 첫인덱스이므로) arr의 길이만큼 순회합니다. 만약 arr의 i번째 원소가 2라면 lastindex에 i를 할당합니다. 배열을 순회하면서 마지막까지 값을 갱신할 것입니다.

  ArrayList를 생성합니다. answer 배열의 크기를 지정하지 못하기 때문입니다. 먼저 리스트를 구한 뒤 배열에 리스트 값을 복사하도록 합니다.

  만약 firstIndex가 -1이라면 list에 -1을 추가합니다. 만약 firstIndex와 lastIndex의 값이 같다면 2가 하나뿐이라는 말이므로 list에 2를 추가합니다. 만약 앞선 조건을 만족하지 않는다면 for문이 firstIndex부터 lastIndex까지 순회합니다. list에 arr의 i번째 원소를 추가합니다.

  answer 배열을 생성하며 배열의 크기를 list의 크기로 지정합니다. for문이 list의 크기만큼 순회하며 answer의 i번째 원소 자리에 list의 i번째 원소를 할당합니다.