알고리즘/자료구조

Python - set 자료형 / BOJ 25192

Aidengoldkr 2026. 2. 10. 03:49

백준 25192 번 문제는 간단히, input을 확인하여, ENTER 이후 새로 들어온사람은 res 값을 +1 해주면 되는 중복 검사 문제이다. 

아래 코드는 백준 25192번을 풀이하면서 처음 작성한 코드이다. 

n = int(input())
res = 0
user = []
flag = False

for i in range(n):
    inpp = input()
    if inpp == "ENTER":
        flag = True
        user = []
    elif flag and inpp not in user:
        res += 1
        user.append(inpp)
        
print(res)

방문한 사람의 정보를 user 라는 리스트 자료형에 저장후 not in 구문을 이용하여 판별하고 있다. 이 구문을 사용하면 시간복잡도가 O(n²)에 가까워져 시간 초과로 오답처리가 된다. 이에 대한 해결책은 List 대신 Set 자료형을 사용하는 것이다.

n = int(input())
res = 0
user = set()
flag = False

for i in range(n):
    inpp = input()
    if inpp == "ENTER":
        flag = True
        user.clear()
    elif flag and inpp not in user:
        res += 1
        user.add(inpp)
        
print(res)

간단하게 list 자료형을 set으로 변경해주면 정답처리된다. 여기에 쓰인 SET 자료형을 탐구해보자.

 

SET 자료형 - 중복을 허가하지 않는 자료형

부제에도 표현되어있는 듯이 set은 중복을 허가하지 않는 자료형이다. 그로 인해 가장 큰 특징 3가지가 있는데,

  • 중복 자동 제거
  • in 연산이 평균 O(1)
  • 순서 없음

로, 시간복잡도가 압도적으로 낮아 PS에 자주 사용되기도 하는데, set은 내부적으로 해시 테이블을 쓰기 떄문이다. 문자열을 해시값으로 변환 후, 위치 바로 계산하여, 처음부터 끝까지 뒤질 필요 없기 떄문이다. 기본적인 사용법은 다음과 같다,

a = set([1,2,3])
b = set({1,2,3})
c = {1,2,3}
# a = b = c

s.add(4)
s.update([5, 6])
s.remove(4)
s.discard(10)
s.clear()

A = {1, 2, 3}
B = {3, 4, 5}

A | B   # {1,2,3,4,5}
A & B   # {3}
A - B   # {1,2}
A ^ B   # {1,2,4,5}

set은 집합으로도 해석되기에 위 예시의 하단 예시와 같이 연산자로 집합 연산 즉 비교도 가능하다.

 

+실전 PS에서 자주 쓰는 패턴

 

중복 제거

unique =set(arr)

 

빠른 방문 체크

visited =set()if xnotin visited:
    visited.add(x)

 

구간 리셋

s.clear()