▼ 문제 바로가기 (링크) ▼
https://leetcode.com/problems/set-mismatch/
1부터 n까지 순서대로 증가하는 정수를
*모두 담은 집합이 배열로 주어진다. (n부터 1까지 감소하는 리스트 포함)
오류로 중복된 숫자와, 원래 숫자를 리스트로 반환하는 문제.
class Solution:
def findErrorNums(self, nums: List[int]) -> List[int]:
cnt = 0
answer = []
for i in nums:
if i == cnt:
answer.append(i)
answer.append(i + 1)
else :
cnt = i
return answer
처음 제출한 코드.
nums의 0번째 인덱스가 시작숫자인 1인 경우 문제 없이 돌아갔지만
히든케이스에서 2 이상의 숫자로 시작하는 경우는 오류가 났다.
input 이 [2,2] 인 경우, 1,2 가 중복되어 1이 사라진 것이므로
[2,1] 로 출력되어야 하는데 [2,3] 으로 출력됐다.
개선한 코드.
class Solution:
def findErrorNums(self, nums: List[int]) -> List[int]:
cnt = 0
answer = []
for i in nums:
if nums[0] != 1: # 시작 숫자가 1이 아닌경우
answer.append(i)
answer.append(1)
break
elif i == cnt:
answer.append(i)
answer.append(i + 1)
else :
cnt = i
return answer
[2,2] 테스트 케이스는 성공했지만 또 다른 오류 발생.
음..정상 배열은 1부터 n까지라고 했는데 n부터 1까지인 경우가 있네.
expected를 보면 원본이 3,2,1 이라는 건데.. 문제 설명이랑 왜 다르지..해서
다시 읽어보니 순서대로 증가하는 원소를 모두 포함하는 집합!이 배열로 주어지는 것.
분기처리 해야되는 부분이 많아지면서 복잡해지길래
내장 함수 검색해보니.. 집합 자료형에서 사용하는 set 함수가 있었다.
지금 보니 제목부터 set Mismatch..
집합 자료형이라는 게 있는 줄 몰라서 엄청 헤맸다..
class Solution:
def findErrorNums(self, nums: List[int]) -> List[int]:
toRemove = sum(nums) - sum(set(nums))
actualMissing = sum(range(1, len(nums)+1)) - sum(set(nums))
return [toRemove, actualMissing]
이건 discuss에서 발견한 코드. 아.. 정말 간단하다...!!!
set은 중복 원소를 허용하지 않는 속성을 가지고 있어서
위처럼 중복 값을 가진 nums를 인자로 받으면 자동으로 삭제한다.
기본 내장 함수니 잘 알아두고 활용해야겠다.
+) 참고 : 집합 자료형
'코딩 테스트 > leetCode' 카테고리의 다른 글
[leetCode] 709. To Lower Case (Python) (0) | 2022.10.24 |
---|---|
[leetCode] 1816. Truncate Sentence (Python) (0) | 2022.10.24 |
[leetCode] 2006. Count Number of Pairs With Absolute Difference K (Python) (0) | 2022.10.22 |
[leetCode] 2418. Sort the People (Python) (0) | 2022.10.21 |
[leetCode]1688. Count of Matches in Tournament (Python) (0) | 2022.10.21 |