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

[프로그래머스 LV.0] 배열 만들기 6

sundori 2024. 2. 12. 18:49

목차

    #1 배열 만들기 6

    문제 설명

    0과 1로만 이루어진 정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk을 만드려고 합니다.

    i의 초기값을 0으로 설정하고 i가 arr의 길이보다 작으면 다음을 반복합니다.

    • 만약 stk이 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
    • stk에 원소가 있고, stk의 마지막 원소가 arr[i]와 같으면 stk의 마지막 원소를 stk에서 제거하고 i에 1을 더합니다.
    • stk에 원소가 있는데 stk의 마지막 원소가 arr[i]와 다르면 stk의 맨 마지막에 arr[i]를 추가하고 i에 1을 더합니다.

    위 작업을 마친 후 만들어진 stk을 return 하는 solution 함수를 완성해 주세요.

    단, 만약 빈 배열을 return 해야한다면 [-1]을 return 합니다.

    제한사항

    • 1 ≤ arr의 길이 ≤ 1,000,000
      • arr의 원소는 0 또는 1 입니다.

    입출력 예

    arr result
    [0, 1, 1, 1, 0] [0, 1, 0]
    [0, 1, 0, 1, 0] [0, 1, 0, 1, 0]
    [0, 1, 1, 0] [-1]

    입출력 예 설명

    입출력 예 #1

    • 각 작업을 마친 후에 배열의 변화를 나타내면 다음 표와 같습니다.
    idx arr[idx] stk
    0 0 []
    1 1 [0]
    2 1 [0, 1]
    3 1 [0]
    4 0 [0, 1]
    5 - [0, 1, 0]
    • 따라서 [0, 1, 0]을 return 합니다.

    입출력 예 #2

    • 각 작업을 마친 후에 배열의 변화를 나타내면 다음 표와 같습니다.
    idx arr[idx] stk
    0 0 []
    1 1 [0]
    2 0 [0, 1]
    3 1 [0, 1, 0]
    4 0 [0, 1, 0, 1]
    5 - [0, 1, 0, 1, 0]
    • 따라서 [0, 1, 0, 1, 0]을 return 합니다.

    입출력 예 #3

    • 각 작업을 마친 후에 배열의 변화를 나타내면 다음 표와 같습니다.
    idx arr[idx] stk
    0 0 []
    1 1 [0]
    2 1 [0, 1]
    3 0 [0]
    4 - []
    • 마지막에 빈 배열이 되었으므로 [-1]을 return 합니다.

     

    #2 알고리즘 및 코드

    import java.util.ArrayList;
    import java.util.List;
    class Solution {
        public int[] solution(int[] arr) {
            List<Integer> stk = new ArrayList<>();
            int i = 0;
            while(i < arr.length){
                if(stk.isEmpty()){
                    stk.add(arr[i]);
                } else{
                    if(stk.get(stk.size() - 1) == arr[i]){
                        stk.remove(stk.size() - 1);
                    } else{
                        stk.add(arr[i]);
                    }
                }
                i++;
            }
            return stk.isEmpty() ? new int[]{-1} : stk.stream().mapToInt(j -> j).toArray();
        }
    }
    정확성  테스트
    테스트 1 〉	통과 (0.03ms, 74.2MB)
    테스트 2 〉	통과 (2.53ms, 79MB)
    테스트 3 〉	통과 (0.03ms, 72MB)
    테스트 4 〉	통과 (1.95ms, 76.2MB)
    테스트 5 〉	통과 (2.74ms, 77.4MB)
    테스트 6 〉	통과 (2.55ms, 78.4MB)
    테스트 7 〉	통과 (2.08ms, 77.4MB)
    테스트 8 〉	통과 (1.82ms, 75.8MB)
    테스트 9 〉	통과 (0.08ms, 75.1MB)
    테스트 10 〉	통과 (2.04ms, 73.7MB)
    테스트 11 〉	통과 (2.25ms, 76.8MB)
    테스트 12 〉	통과 (6.33ms, 79MB)
    테스트 13 〉	통과 (4.83ms, 80MB)
    테스트 14 〉	통과 (4.07ms, 73.2MB)
    테스트 15 〉	통과 (2.95ms, 76.7MB)
    테스트 16 〉	통과 (17.05ms, 82.4MB)
    테스트 17 〉	통과 (17.69ms, 85.8MB)
    테스트 18 〉	통과 (30.79ms, 94.7MB)
    테스트 19 〉	통과 (38.94ms, 121MB)
    테스트 20 〉	통과 (14.32ms, 83.6MB)
    -----------------------------------------------------
    import java.util.ArrayList;
    import java.util.List;
    
    class Solution {
        public int[] solution(int[] arr) {
            List<Integer> stk = new ArrayList<>(arr.length); // 초기 용량 설정
            int i = 0;
            while (i < arr.length) {
                if (stk.isEmpty() || stk.get(stk.size() - 1) != arr[i]) {
                    stk.add(arr[i]);
                } else {
                    stk.remove(stk.size() - 1);
                }
                i++;
            }
            
            if (stk.isEmpty()) {
                return new int[]{-1};
            } else {
                int[] result = new int[stk.size()]; // 배열의 크기를 미리 정의하여 메모리 할당 횟수 줄임
                for (int j = 0; j < result.length; j++) {
                    result[j] = stk.get(j);
                }
                return result;
            }
        }
    }
    정확성  테스트
    테스트 1 〉	통과 (0.03ms, 72.2MB)
    테스트 2 〉	통과 (0.03ms, 72.9MB)
    테스트 3 〉	통과 (0.04ms, 82.4MB)
    테스트 4 〉	통과 (0.07ms, 76.4MB)
    테스트 5 〉	통과 (0.07ms, 74.5MB)
    테스트 6 〉	통과 (0.05ms, 73.2MB)
    테스트 7 〉	통과 (0.09ms, 93.2MB)
    테스트 8 〉	통과 (0.04ms, 67.4MB)
    테스트 9 〉	통과 (0.07ms, 71.9MB)
    테스트 10 〉	통과 (0.24ms, 67.3MB)
    테스트 11 〉	통과 (0.28ms, 75.8MB)
    테스트 12 〉	통과 (4.49ms, 68.1MB)
    테스트 13 〉	통과 (3.63ms, 81.7MB)
    테스트 14 〉	통과 (3.61ms, 92.2MB)
    테스트 15 〉	통과 (1.14ms, 79.3MB)
    테스트 16 〉	통과 (16.28ms, 75.6MB)
    테스트 17 〉	통과 (24.05ms, 106MB)
    테스트 18 〉	통과 (25.69ms, 91.7MB)
    테스트 19 〉	통과 (50.18ms, 127MB)
    테스트 20 〉	통과 (14.82ms, 78.2MB)

    이 코드는 입력된 배열 arr에서 중복된 숫자를 제거하는 방식으로 동작한다. 스택으로 사용되는 리스트에 대한 조작은 스택의 LIFO(Last-In-First-Out) 특성을 따른다. 만약 스택이 비어있거나 스택의 맨 위 요소가 현재 배열 요소와 다르다면 현재 배열 요소를 스택에 추가하고, 그렇지 않으면 스택의 맨 위 요소를 제거한다. 마지막으로, 스택이 비어있다면 -1을 포함한 배열을 반환하고, 비어있지 않다면 리스트를 배열로 변환하여 반환한다.