Python

[Python/파이썬] 백준 # 26069

Doldoi 2025. 4. 3. 06:42

문제 링크: https://www.acmicpc.net/problem/26069

 

문제

 


코드

from collections import deque

n = int(input())
li = deque()

for _ in range(n):
    a, b = input().split()
    if a == "ChongChong":
        li.append(b)
    elif b == "ChongChong":
        li.append(a)

    if a in li:
        li.append(b)
    elif b in li:
        li.append(a)

print(len(set(li)))

 

처음 작성한 코드는 한 줄에 입력되는 두 이름들을 띄어쓰기를 기준으로 나누어서 a, b 변수에 입력받고,

a나 b에 "ChongChong" 이라는 이름이 들어오면 그 짝을 li라는 큐에 저장한다.

그리고나서 다음 줄에서 a나 b에 들어온 이름이 ChongChong과 함께 입력된적 있는 이름이라면

또한 li 큐에 저장한다.

마지막으로 set()으로 중복을 제거한 후 그 개수를 출력했다.


문제점

처음 작성한 코드로도 제출 했을 때 정답처리 되었지만 더 생각해보니 몇가지 문제점들이 있었다.

  • 불완전한 중복 처리 방식
    li(큐)에 중복된 이름이 여러번 들어갈 수 있음.
    마지막에 set(li)를 사용해서 중복을 제거한다고 해도, 처음부터 중복된 데이터가 들어가는 걸 방지하는 것이 더 효율적.
  • 시간 복잡도 문제
    li에 사람이 들어있는지 (a in li or b in li)를 체크하는데,
    이 방식은 li를 리스트로 관리하면서 검색하는 것이기 때문에 O(n), 최악의 경우 O(n$^2$)의 시간이 걸려 비효율적.

성능개선

from collections import deque

n = int(input())

dance_people = {"ChongChong"}
queue = deque(["ChongChong"])

for _ in range(n):
    a, b = input().split()

    if a in dance_people or b in dance_people:
        if a not in dance_people:
            dance_people.add(a)
            queue.append(a)
        if b not in dance_people:
            dance_people.add(b)
            queue.append(b)

print(len(dance_people))
  • set을 사용하여 탐색 속도 개선 (O(1))
    dance_people을 set으로 만들어서, a in dance_people 탐색을 O(1) 속도로 빠르게 수행.
  • 중복된 데이터가 처음부터 queue에 들어가지 않음
  • 시간 복잡도 개선 (O(n))
    리스트를 매번 검색하는 O(n$^2$) 방식 대신, set을 사용하여 O(n)만에 탐색 가능.