class Solution {
public int[] solution(int []arr) {
int copy[]=new int[arr.length+1];
System.arraycopy(arr,0,copy,0,arr.length);
copy[copy.length-1]=-1;
List<Integer>list=new ArrayList<>();
for(int i=0;i<copy.length-1;i++){
if(copy[i]==copy[i+1]){
continue;
}else{
list.add(copy[i]);
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
1. copy라는 배열을 만들고
2. copy의 배열의 크기 = arr배열의 크기 + 1 의 크기로 설정한다.
3. copy의 마지막 배열의 앞에 copy[copy.length-1] = -1을 설정
4. 반복문을 돌리는데 arr의 배열 크기만큼만 돌릴 수 있도록 copy.length에 1를 빼준다.
5. copy[i]와 copy[i+1]이 같은면 continue하고 다르면 list에 넣는다.
6. 리스트를 스트림으로 변환 mapToInt로 정수 인자로 배열처리되어 리턴된다.
* 2번을 한 이유?
i+1을 했을 때 기존 넘어온 배열을 기준으로 반복문을 돌렸을 때 마지막 중복되는 숫자를 list에 담을 수 없다.
그리고 배열 크기가 초과했다는 에러 메시지가 뜰 것이다.
이를 방지하기 위해 copy라는 배열에 arr.length+1하는게 일반적인다.
그러나, 여기서 문제점은 배열은 0으로 초기화되고 copy 배열의 마지막에는 0이 들어간다.
{1,0,0,0}이런 경우 {1,0}이 출력되어야 하지만 {1}이렇게 출력되는 경우가 생긴다.
그렇기에 arr.length+1가 copy 배열의 크기가 되는 것이다.
{1,0,0,0} -> {1,0,0,0,-1} 이렇게 설정 해둔 후
반복문은 딱 arr.length의 길이만큼 돌리면 된다. i+1을 했을 때 -1을 만나면 copy[i]의 값이 리스트에 들어가고 반복문을 더 이상 돌리지 않기 때문에 끝난다. -1은 들어갈 수 없는 배열이다.
'코딩테스트 문제풀이' 카테고리의 다른 글
보이는 학생 (0) | 2022.04.04 |
---|---|
큰 수 출력하기 (0) | 2022.04.04 |
퀵 정렬(Quick Sort), 퀵 셀렉트 (0) | 2022.02.03 |
분할 (0) | 2022.02.02 |
삽입 정렬 (0) | 2022.02.02 |