Algorithm/(Java) PS
[Leetcode Top Interview 150] 26. Remove Duplicates from Sorted Array
noahkim_
2023. 8. 25. 04:19
난이도 : easy
- 오름차순인 nums를 오직 한번만 나타나는 유일한 값만 남겨라 (in-place)
- 중복 지우기
- nums 는 오름차순일 것
- 남아있는 요소의 갯수를 리턴하라
- int[] nums
- 1 <= nums.length <= 3 * 10^4
- -100 <= nums[i] <= 100
1. 접근법
- 보여주려는 원소는 앞으로 당겨야 함
- 원소가 달라지면 달라졌던 횟수만큼 앞으로 당기기
- 달라진 횟수가 해당 원소가 있어야 할 자리임
- 유일한 원소만 보고싶으니까
- 원소가 다르면 보여주려는 범위를 하나씩 늘리기
2. 의사코드
for (i 첫번째...마지막) {
if (nums[i]가 nums[i+1]과 달라지면) {
nums[i+1]을 현재까지 탐색하면서 달라졌던 횟수에 맞는 자리에 두기
}
}
return 달라진 횟수 + 1
3. 구현 코드
class Solution {
public int removeDuplicates(int[] nums) {
int count = 0;
for (int i = 0; i < nums.length-1; i++) {
if (nums[i] != nums[i+1]) {
nums[++count] = nums[i+1];
}
}
return count+1;
}
}
- 보여주고 싶은 원소 범위는 첫번째 인덱스도 포함해야 함
- 그러므로 count+1 을 리턴함
4. 시간복잡도, 공간복잡도 예상
- 시간복잡도 : O(n) - n개 원소까지 반복하므로
- 공간복잡도 : O(1) - n개 원소를 돌아도 반복문 안에서 선언되는 변수는 없으므로 상수값만 메모리에 잡힘
5. 개선점
잘 모르겠다
6. 회고
다른 블로그를 검색해도 나랑 거의 똑같이 풀었다.
class Solution {
public int removeDuplicates(int[] nums) {
int index = 1;
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] != nums[i + 1]) {
nums[index++] = nums[i + 1];
}
}
return index;
}
}
(출처 : https://bcp0109.tistory.com/260)
위의 코드가 더 나은것 같다
왜냐하면
1. 맨 앞의 값은 당연히 포함되므로 index를 1로 설정함으로써 for문의 가독성과 응집성이 올라간다
2. index값만 리턴하므로 왜 1을 더했는지 생각하지 않아도 된다
처음부터 무식하게 반복문을 돌리다가 잘 안풀렸다.
그러다 '아니 내가 보여주고 싶은 값은 유일한 값인데 그렇다면 유일하게 변한 카운트를 세서 카운트 수만큼 앞에 배치하고
카운트 값 리턴하면 되는거 아니야?' 이런생각이 들었다
그래서 막 다 해보면서 왜안되지 생각하다 작성된 코드 베이스로 짜다보니 의도가 확실히 전달되지 않았다
좀더 침착하게 짰으면 어땠을까 생각이 든다
물론 저런 생각을 한것도 문제 의도에 일치한다 생각한다
자꾸 빨리 푸려는게 있어서.. 잘 풀더라도 작은 것들 때문에 말릴 수 있다.
침착하게 생각을 정리하고 코드를 작성해야겠다