연습문제
🔥 같은 숫자는 싫어 🔥
배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져있다.
이때 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 한다.
단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야한다.
배열 arr에서 연속적으로 나타는 숫자는 제거하고 남은 수들을 return하는 solution을 완성해보자.
arr | return |
---|---|
[1,1,3,3,0,1,1] | [1,3,0,1] |
[4,4,4,3,3] | [4,3] |
import java.util.*;
import java.util.stream.Collectors;
public class Solution {
public int[] solution(int []arr) {
//배열을 리스트로
List<Integer> list = Arrays.stream(arr)
.boxed()
.collect(Collectors.toList());
for(int i=0;i<list.size()-1;i++){
if(list.get(i) == list.get(i+1)){
list.set(i,-1);
}
}
//리스트를 배열로
int[] answer = list.stream()
.filter(i -> i != -1)
.mapToInt(i -> i)
.toArray();
return answer;
}
}
처음 풀때는 너어무 복잡하게 돌아돌아갔다.
굳이 list를 사용하지 않아도 되는데 배열을 list로 변경하고 또 list를 배열로 변경하는 불필요한 일을 했다.
위의 코드로는 효율성테스트를 통과하지 못했다...
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
for(int i=0;i<arr.length-1;i++){
if(arr[i] == arr[i+1]){
arr[i] = -1;
}
}
int[] answer = Arrays.stream(arr)
.filter(i -> i != -1)
.toArray();
return answer;
}
}
놀랍게도 통과❗️
메모리: 113 MB, 시간: 34.41 ms
뭔가 실행시간이 너무 오래 걸린것 같지만 스스로 해결하다니 뿌듯!
import java.util.*;
public class Solution {
public int[] solution(int []arr) {
ArrayList<Integer> tempList = new ArrayList<Integer>();
int preNum = 10;
for(int num : arr) {
if(preNum != num)
tempList.add(num);
preNum = num;
}
int[] answer = new int[tempList.size()];
for(int i=0; i<answer.length; i++) {
answer[i] = tempList.get(i).intValue();
}
return answer;
}
}
왜 preNum을 이용할 생각을 못했을까
제일 먼저 떠올린 방법이기는 하지만 두번째 입출력 예시의 경우에 출력이 [4,4,3]이 나오면서 3번 중복되는 값을 제거하지 못해서 포기했는데❗️❗️
메모리: 117 MB, 시간: 26.64 ms
포기하지 말고 좀 더 생각해보자...