극동대학교\AI컴퓨터공학과\JAVA/프로그래머스 코딩 기초 트레이닝

[프로그래머스, LV.0] 2의 영역

sundori 2023. 9. 6. 15:28

목차

    #1 2의 영역

    문제 설명

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

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

    제한사항

    • 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}

    #2 알고리즘 및 코드

    import java.util.ArrayList;
    import java.util.List;
    class Solution {
        public int[] solution(int[] arr) {
            boolean check = false;
            int start = 0, end = 0;
            List<Integer> list = new ArrayList<>();
            for(int i = 0; i < arr.length; i++){
                if(arr[i] == 2 && !check) {
                    start = i;
                    check = !check;
                }else if(arr[i] == 2 && check){
                    end = i;
                } else if(end == 0) {
                    end = start;
                }
            }
            if(start == 0 && end == 0){
                list.add(-1);
                return list.stream().mapToInt(i->i).toArray();
            } else if(start == end){
                list.add(arr[start]);
                return list.stream().mapToInt(i->i).toArray();
            }
            for(int j = start; j <= end; j++){
                if(start == 0 && end == 0){
                    list.add(-1);
                    return list.stream().mapToInt(i->i).toArray();
                }
                list.add(arr[j]);
            }
            return list.stream().mapToInt(i->i).toArray();
        }
    }
    ---------------------------
    정확성  테스트
    테스트 1 〉	통과 (3.59ms, 78.8MB)
    테스트 2 〉	통과 (5.41ms, 73.5MB)
    테스트 3 〉	통과 (12.37ms, 88.1MB)
    테스트 4 〉	통과 (27.23ms, 93MB)
    테스트 5 〉	통과 (36.19ms, 95.3MB)
    테스트 6 〉	통과 (6.92ms, 93.9MB)
    테스트 7 〉	통과 (13.76ms, 110MB)
    테스트 8 〉	통과 (13.26ms, 85.1MB)
    테스트 9 〉	통과 (8.48ms, 84.1MB)
    테스트 10 〉	통과 (13.76ms, 95.1MB)
    테스트 11 〉	통과 (11.85ms, 95.8MB)
    테스트 12 〉	통과 (13.25ms, 100MB)
    테스트 13 〉	통과 (4.39ms, 86.1MB)
    테스트 14 〉	통과 (12.68ms, 106MB)
    • 저장을 시작할지 정하는 불린 check와 저장을 시작할 시작 위치(시작 인덱스 번호)와 저장을 그만둘 위치를 저장할 start와 end 변수를 생성하였다.
    • 그 후 for 문을 통하여  arr의 길이만큼 반복하며 만약 arr [i]의 원소 값이 2이며, check가 참(true)라면 시작 위치를 받으며 check를 
      true로 바꾸어 준다. (주의 ! 불린 변수 check의 초기 변수 값은 false이기 때문에! check는 true이다.)
      만약 이 조건이 충족되지 않는다면
    • 다음 조건인 arr[i]의 원소 값이 2이며, check가 false라면 종료 위치를 받는다.
    • 이것도 아니라면 end가 0일 때 시작 위치(start)를 종료 위치(end)에 저장한다.
    • 이렇게 하여 저장을 시작할 위치와 저장을 종료할 위치를 알 수 있으며, 2가 하나만 있다는 경우에 그 원소 값만 저장하기 위한 경우도 해결이 가능하다.