참고
문제해설
문제 로직고민
NOTE
•
2번을 넘어선 반복요소를 어떻게 찾는가?
int idx = 2;
int k = 0;
for(int i = 2; i < 배열 길이; i++) {
if(배열[i] <= 배열[i-2] k++;
else 배열[idx++] = 배열[i];
}
Java
복사
처음 생각한 로직
◦
이전 문제를 응용해 이번 문제에서는 n의 요소가 n-2보다 커야 중복되지 않는다고 판단했다.
◦
당연히 될줄알았는데 예상하지 못한 케이스가 있었다. 특정경우에 비교되어야 하는 값이 바뀐다는 점이다.
2번째 2에서 원래라면 1을 비교해 배열에 기록하지만,
1번째 2에서 2로 변경되어 생략되어버림
•
코드 수정
int idx = 2;
for(int i = 2; i < 배열 길이; i++) {
if(배열[i] != 배열[idx-2]) {
배열[idx++] = 배열[i]
}
}
Java
복사
◦
배열이 변경되는것에 영향을 받지 않도록 코드를 수정했다.
◦
다음과 같이 작성하면 idx의 위치기반으로만 보기때문에 문제없이 돌아간다.
작성코드
NOTE
class Solution {
public int removeDuplicates(int[] nums) {
int idx = 2;
for(int i = 2; i < nums.length; i++){
if(nums[i] != nums[idx-2]){
nums[idx++] = nums[i];
}
}
return idx;
}
}
Java
복사
정답코드
NOTE
class Solution {
public int removeDuplicates(int[] nums) {
int index = 0;
int numberOfDuplicate = 1;
for ( int num : nums){
if (index <= 1 || nums[index-2]!=num){
nums[index++] = num ;
}
}
System.gc();
return index;
}
}
Java
복사
메모리를 가장 적게 사용하는 코드
•
이번에도 메모리가 2MB정도 밖에 차이안나서 크게 개선할점은 보이지 않는다.
•
System.gc();가 메모리와 관련되있는건가? 가비지컬렉션을 실행시키는 이유는 잘모르겠다.