🧩 Algorithm/LeetCode

[LeetCode] 2336 Smallest Number in Infinite Set

nerowiki 2024. 5. 25. 18:59
728x90

 

문제 설명

You have a set which contains all positive integers [1, 2, 3, 4, 5, ...].

Implement the SmallestInfiniteSet class:
SmallestInfiniteSet() Initializes the SmallestInfiniteSet object to contain all positive integers.
int popSmallest() Removes and returns the smallest integer contained in the infinite set.
void addBack(int num) Adds a positive integer num back into the infinite set,
if it is not already in the infinite set.
제한사항
1. 1 <= num <= 1000
2. At most 1000 calls will be made in total to popSmallest and addBack.

 

문제 회고

💡 어떤 문제가 있었고, 나는 어떤 시도를 했는지 그리고 새롭게 안 사실은 무엇인지

popSmallest 함수와 addBack 함수를 구현해내는 문제입니다. 
popSmallest 는 가장 작은 값을 꺼내는 메소드이고, addBack 는 매개변수의 숫자를 더해주는 메소드입니다.

  1. 먼저, 제한 조건에서 양의 정수가 최대 1000까지 주어지므로 생성자에서 이 값이 삽입된 set 집합을 생성합니다.
  2. popSmallest 에서는 set 함수에서 사용되는 제거 함수인 discard를 사용합니다.
  3. addBack 에서는 생성된 set 집합에 추가할 숫자가 없을 경우 추가와 함께 True를 리턴합니다. 
보통 원소 삭제 함수로 remove 메소드를 사용합니다.
remove 메소드는 만일 집합에 해당 요소가 존재하지 않으면 KeyError 예외가 발생합니다.
반면 discard 메소드는 집합에 요소가 존재하지 않아도 아무 일도 일어나지 않는다는  차이가 있습니다.
따라서 discard를 사용했을 때 집합에 해당 요소에 존재 여부와 상관없이 안전하게 제거할 수 있는 것입니다.
예외 처리를 따로 하지 않아도 되기 때문에 코드가 더 간결해지고 예외 상황을 처리할 필요가 없습니다.

 

SmallestInfiniteSet 객체를 생성할 경우 다음의 메서드를 통해 올바른 결과 값을 리턴할 수 있습니다.

💡 내가 해결한 방식은?
class SmallestInfiniteSet:
	
    def __init__(self):
    	self.t = set(range(1, 1001))
        
    def popSmallest(self) -> int:
    	# 리스트 최소 숫자 제거
        s = min(self.t)
        self.t.discard(s)
        return s
    
    def addBack(self, num: int) -> None:
    	# 리스트에 숫자 더하기
        if num not in self.t:
        	self.t.add(num)
            return True
        else:
            return False

 


✍️  TIL

LeetCode 문제는 Medium 이상 문제들로 게시할 것 같다. 특별한 자료구조 활용은 하지 않았지만,
확실히 클래스와 함수를 채우는 과정이 좋다고 느껴졌다. 생성자와 세부 메소드 구성을 채우는데 
조금 더 의미있는 고민들이 들어간 기분이다.