백준 5597번: 과제 안 내신 분..?

2023. 8. 23. 00:02개인활동/코테

student = list(range(1, 31))
l = [map(int, input()) for _ in range(28)]
print(l)
for i in l: student.remove(i); print(student.sort())

예제로 코드를 돌리면 계속 이렇게 떠서 l의 원소들을 확인해보았었다.

입력받은 각 숫자들이 들어간 것이 아닌 map object로 구성이 되어있었다.

대괄호를 이용해서 그런가 싶어서 list()로 바꾸어봐도 똑같은 결과를 가져온다.

 

도대체 뭘까 라고 생각하던 중 힌트가 된 글이 하나가 있다.

(참고 자료: https://velog.io/@jakob1/SW%EC%82%AC%EA%B4%80%ED%95%99%EA%B5%90-%EC%A0%95%EA%B8%80-%EA%B0%9C%EB%B0%9C%EC%9D%BC%EC%A7%80-1%EC%A3%BC%EC%B0%A8-Python-%EC%A0%95%EB%A6%AC)

 

그러나 이전에 문제들을 풀었을 때를 곰곰히 생각해보면 이게 안될리가 없는데!!

 

그래서 다른 방식으로 문제를 풀었다.

student = list(range(1, 31))
for _ in range(28):
    student.remove(int(input()))

print(*student)

이 방법은 성공했고... 이전의 코드보다 오히려 이게 더 짧았다.

아무래도 입력받고 제거하는 과정이 간소화되어서 그런 듯 하다.

 

위의 코드에서 map object가 왜 반환되지 않은 것인지 좀 알아봐야할 듯 하다.

 

일단 유사한 방식으로 다르게 짜본 코드들도 함께 업로드 해보자면

student = list(range(1, 31))
l = [int(input()) for _ in range(28)]
for i in l: student.remove(i)
print(*student)
student = list(range(1, 31))
for _ in range(28): student.remove(int(input()))
print(*student)

최종적으로 짧게 만들어 본 코드는 이것이다

 

그렇다면 다른 사람들은 얼마나 짧게 만들었을까?

저번엔 이런 문구가 있는 줄 몰랐는데 이런 문구가 눈에 띄었다.여튼 숏코드를 뜯어보자.

print(*{*map(int,open(0))}^{*range(1,31)})

일단 "^" 연산자는 비트연산자 중 하나로 XOR 연산을 수행한다.

XOR 연산은 둘중에 하나가 참일 때 참을 반환하는데, XOR에 대해 찾아보다 신기한 것을 발견했다.

(참고 자료: https://gksdudrb922.tistory.com/203)

 

값을 swap할 때 ^= 연산자를 이용하면 임시 변수 필요 없이 값을 swap할 수 있다고 한다.

 

여튼 여기서는 왜 저 연산자가 사용된 것인지 일단 앞에서부터 차근차근 봐야할 것 같다.

 

궁금한 점부터 정리하자

1. {} 중괄호가 사용된 이유는?

2. ^ XOR 연산자의 의미는?

 

1. {} 중괄호가 사용된 이유는?

흐음... 일단 중괄호의 경우에는 딕셔너리 형인데 무언가 이상하다. 혹시나 다른 형일 수 있으니 한번 테스트를 해보자.

테스트를 해보니 set 자료형이다. 집합자료형이라니 오랜만에 마주하는 것 같다.

 

딕셔너리의 경우 key-value가 무조건 쌍으로 존재해야 하는데 쌍으로 존재하지 않으니!! 일단 이건 확실히 아니었으나 혹시나 싶었다. 하지만 아니라는걸 알았으니 딕셔너리는 무시하고, set형으로 생각하면 될 듯하다.

 

(참고 자료: https://wikidocs.net/1015)

 

2. ^ XOR 연산자의 의미는?

일단 이 연산자는 위에서 이야기한 것처럼 둘중에 하나가 없다면 1을 반환하는 연산자이다.

일단 집합은 순서가 상관없기에 두 집합에 있는 요소들을 비교한다고 볼 수 있을 것 같다.

 

이때 두 집합에 모두 존재한다면 False를 반환하는 것이기 때문에 연산을 했을 때 반환값으로 사용되지 않을 것이다.

두 집합 중 하나에만 존재하는 경우, 즉 문제에서 원하는 전체 명단 중 과제를 안낸 사람을 걸러낼 수 있는 것이다.

 


오늘도 재미있는 하루

어제는 엠티 가서 문제를 못풀었다.

그래서 일요일에 두문제 풀었음!!

 

여튼 다시 오늘부터 1일 1백준

'개인활동 > 코테' 카테고리의 다른 글

백준 10811번: 바구니 뒤집기  (1) 2023.08.24
백준 3052번: 나머지  (0) 2023.08.23
백준 10813번: 공바꾸기  (0) 2023.08.20
백준 10810번: 공넣기  (0) 2023.08.20
백준 2562번: 최댓값  (0) 2023.08.19