반응형
✔️ 문제 설명
배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,
- arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
- arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.
배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.
더보기

✔️ 입출력 예

✔️ 제한사항
- 배열 arr의 크기 : 1,000,000 이하의 자연수
- 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수
✔️ 코드 구상
1. 순서를 지켜야하므로 List로 arr를 받는다
2. iter를 돌며 이전꺼와 같으면 삭제
3. arr로 반환
✔️ 1차 코드 (효율성 실패)
import java.util.*;
import java.util.stream.Collectors;
public class Solution {
public int[] solution(int[] arr) {
int[] answer = {};
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
int iter = 1;
Object prev = list.get(0);
while(list.size() != iter) {
Object header = list.get(iter);
if(prev == header) {
list.remove(iter);
} else {
prev = header;
iter++;
}
}
answer = list.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
}
✔️ 2차 코드 (성공)
- List에서 중간 요소를 추가/삭제하면 해당 요소 뒤에 요소들의 자리를 한 칸씩 이동시켜야하므로 시간복잡도가 늘어나게 된다.
- 그 부분이 효율성을 통과하지 못한 이유라고 생각했고 삭제하는 방식이 아닌 새로운 요소에 추가하는 방식으로 개선했다.
import java.util.*;
public class Solution {
public int[] solution(int[] arr) {
int[] answer = {};
List<Integer> list = new ArrayList<>();
int num = arr[0];
list.add(num);
for(int i = 1; i < arr.length; i++) {
if(arr[i] != num) {
list.add(arr[i]);
num = arr[i];
}
}
answer = list.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
}
📄 원문
반응형
'🧠 Algorithm > [JAVA] Programmers' 카테고리의 다른 글
[12915번] 문자열 내 마음대로 정렬하기 (0) | 2022.06.15 |
---|---|
[12910번] 나누어 떨어지는 숫자 배열 (0) | 2022.06.14 |
[17682번] [1차] 다트 게임 (0) | 2022.06.12 |
[12903번] 가운데 글자 가져오기 (0) | 2022.06.11 |
[17681번] 비밀지도 (0) | 2022.06.10 |