<로직 고민/>
- 흠...이것도 인덱스 놀이인가?
- 근데 일단 내 방법대로 풀면 nums를 맨 뒤 인덱스부터 순환해서 val과 같은 요소가 있으면 remove 하고 for문이 다 돌면 변수 k에 nums의 길이를 담아 return 하는 건데......
- 일단 그렇게 푸니 테스트 통과는 한다
<완성된 풀이/>
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
for num in nums[::-1]:
if num == val:
nums.remove(num)
k = len(nums)
return k
<다른 사람 풀이/>
- 천재풀이1
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
index = 0
for i in range(len(nums)):
if nums[i] != val:
nums[index] = nums[i]
index += 1
return index
- 시간복잡도: O(n) / 공간복잡도: O(1)
- 아주 간단하군
- 처음에 4번째줄대로 똑같이 썼었는데 그 다음에 어떻게 풀어야 할지 모르겠어서 지우고 배열 맨 뒤 인덱스부터 순회하는 방법으로 풀었다
- 근데 이 풀이 채점해보니까 내 풀이보다 3ms 더 걸리네 ㅎ??
- 천재풀이2
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
nums[:] = [num for num in nums if num != val]
return len(nums)
- 아...~ 굳이 변수 k 선언 안 하고 그냥 len(nums)를 리턴했어도 됐었지..!!!
- 근데 nums[:]은 뭐지 배열 전체를 가리키는 건가
- 그냥 nums 하면 안 되는거였나? -> 안 된다 ㅋㅋㅋ
- 찾아보니 nums[:]는 nums 배열의 모든 요소를 선택함으로써 원본 배열을 수정하는 식이 되는거고, nums를 사용하면 nums라는 새로운 변수가 수정된 배열을 참조해서 원하는 값을 얻지 못한다는 거다
- 변수명이 겹쳐서 그러나 싶어 nums1로 바꾸고 return 값도 len(nums1)로 바꿔봤는데 틀린다
- 애초에 슬라이싱을 안 하면 배열에 [3,2,2,3]으로 했을 때 [3,2]가 나온다 (왜??!?)
<수정/>
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
for num in nums[::-1]:
if num == val:
nums.remove(num)
return len(nums)
- 천재풀이2를 보고 굳이 변수 k에 값을 담을 필요가 없을 것 같아서 바로 nums의 길이를 리턴하는 것으로 변경해보았다
- 근데 실행시간은 수정한 풀이가 더 걸리네
- 얼마 차이는 안 나지만..