코딩테스트

[백준] 19583번 - 싸이버개강총회

miniberry 2026. 3. 25. 13:50

1. 문제 요약

온라인 스트리밍으로 진행된 개강총회에서
출석 인정 조건은 다음과 같다.

    1) 입장 확인

        - 시작 시간 S 이전 또는 정확히 S 시각에 채팅한 사람

    2)  퇴장 확인

        - 종료 시간 E 이후부터 스트리밍 종료 Q까지 채팅한 사람

즉,

S 이전에 채팅 + E~Q 사이에 채팅
둘 다 만족하는 사람 수를 구하는 문제


2. 접근 아이디어

이 문제는 딱 보면 복잡해 보이지만 핵심은 단순하다.

  사람을 두 번 필터링하면 된다.

    1) 입장 체크

time <= S
 

→ 이때 채팅한 사람들을 enter 집합에 저장


    2) 퇴장 체크

 
E <= time <= Q
 

이때 채팅한 사람 중에서 이미 enter에 있었던 사람만 카운트


3. 핵심 포인트

    1) 입력 끝 처리

이 문제는 채팅 개수가 안 주어짐

해결방법:

for line in sys.stdin:
 

이유:

  • EOF(입력 끝)까지 자동으로 읽음
  • 따로 개수 안 세도 됨

    2) 시간 비교 (핵심 트릭)

 
"06:00" < "12:00"
 

문자열 비교로도 시간 비교 가능

이유:

  • HH:MM 형식 (항상 두 자리)
  • 사전순 == 시간순

    3) set 사용 이유

 
enter = set()
leave = set()
 

이유:

  • 중복 제거 자동
  • 빠른 탐색 (O(1))

4. 최종 코드

 
 
import sys

S, E, Q = input().split()
enter = set()
leave = set()

for line in sys.stdin:
    time, name = line.split()
	
    if time <= S:
        enter.add(name)
    
    if E <= time <= Q:
        if name in enter:
            leave.add(name)

print(len(leave))

5. 시간 복잡도

O(N)
 

이유:

  • 한 번 순회
  • set 탐색 O(1)