- 최대공약수에 대한 부분을 다루는 문제였다.
- 마지막에서 1을 제거한 다음에 답을 출력하는 방향으로 코드를 적었는데
remove
는 답이 될 수 없고discard()
는 답이 될 수 있다고 하여 이 부분이 이해가 잘 안가서 추가적으로 공부했다.
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))))
집합(Set)
의 discard()
와 remove()
의 차이점 정리discard()
와 remove()
다. 이 두 메소드의 동작 차이점을 코드를 통해서 이해해보자.📌 ①. 집합 remove()
s = set()
s.add(10)
s.remove(10)
s.remove(10)
remove()
메소드를 이용해서 두 번 제거했다. 이 코드의 실행결과는 어떻게 나올까?Traceback (most recent call last):
File "set.py", line 5, in <module>
s.remove(10)
KeyError: 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()
는 집합 안에 존재하지 않음을 보장하려고 할 때 사용한다.