#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을 포함한 배열을 반환하고, 비어있지 않다면 리스트를 배열로 변환하여 반환한다.
'JAVA > 프로그래머스 코딩 기초 트레이닝' 카테고리의 다른 글
[프로그래머스 LV.0] 배열의 길이를 2의 거듭제곱으로 만들기 (0) | 2024.02.16 |
---|---|
[프로그래머스 LV.0] 무작위로 k개의 수 뽑기 (0) | 2024.02.16 |
[프로그래머스 LV.0] 빈 배열에 추가, 삭제하기 (0) | 2024.02.12 |
[프로그래머스 LV.0] 배열의 원소만큼 추가하기 (0) | 2024.02.12 |
[프로그래머스, LV.0] 세 개의 구분자 (0) | 2024.02.12 |