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가 하나만 있다는 경우에 그 원소 값만 저장하기 위한 경우도 해결이 가능하다.
728x90