[백준] 2981번 검문 ★

Turtle·2023년 2월 20일
0
post-thumbnail

💡문제접근

  • 최대공약수에 대한 부분을 다루는 문제였다.
  • 마지막에서 1을 제거한 다음에 답을 출력하는 방향으로 코드를 적었는데 remove는 답이 될 수 없고 discard()는 답이 될 수 있다고 하여 이 부분이 이해가 잘 안가서 추가적으로 공부했다.

💡코드(메모리 : 31256KB, 시간 : 40ms)

import sys
input = sys.stdin.readline

li = []
N = int(input().strip())
for i in range(N):
    li.append(int(input().strip()))
li.sort()

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

temp = abs(li[1] - li[0])
for i in range(1, N-1):
    temp = gcd(temp, abs(li[i+1] - li[i]))

result = set()
for i in range(1, int(temp**0.5)+1):
    if temp % i == 0:
        result.add(i)
        result.add(temp // i)

# 기존에 작성했던 코드
# result = sorted(result)
# result.remove(result[0])
result.discard(1)
print(" ".join(map(str, sorted(result))))

💡소요시간 : 40m

📌 [Python] 집합(Set)discard()remove()의 차이점 정리

  • Python에서 사용할 수 있는 자료구조 중에 집합이 있다. 집합 자료구조 형태에서 특정 원소를 제거하는 메소드는 두 가지가 존재한다. 바로 discard()remove()다. 이 두 메소드의 동작 차이점을 코드를 통해서 이해해보자.

📌 ①. 집합 remove()


s = set()

s.add(10)
s.remove(10)
s.remove(10)
  • 10이라는 숫자를 집합에 추가했다가 remove() 메소드를 이용해서 두 번 제거했다. 이 코드의 실행결과는 어떻게 나올까?
Traceback (most recent call last):
  File "set.py", line 5, in <module>
    s.remove(10)
KeyError: 10
  • 에러가 발생한다. 집합에서 10이라는 값을 제거하라고 했지만 집합은 이미 첫 번째 remove() 메소드를 통해서 제거가 된 상태이기 때문에 10이라는 값은 존재하지 않는다. 그래서 KeyError가 발생한 것이다.
s = set()

s.add(10)
s.remove(10)
s.remove(10)
Process finished with exit code 0
  • 위의 코드는 remove() 메소드 대신에 discard() 메소드를 사용한 코드이다. 보다시피 에러가 발생하지 않고 정상적으로 실행되는 것을 확인할 수 있다.

  • 📌 정리하자면 remove() 메소드는 없는 키를 지우라고 하면 해당 키가 없다는 에러인 KeyError를 발생시킨다. 반면 discard() 메소드는 없는 키를 지우라고 해도 에러가 발생하지 않는다. remove()는 실제 타입 안에 존재하는 원소를 지우는 동작에 사용하고 discard()는 집합 안에 존재하지 않음을 보장하려고 할 때 사용한다.

0개의 댓글