-
[백준] 20438번: 출석체크 (Python)Algorithm PS👩🏻💻/백준 2023. 5. 4. 12:47
문제
20438번: 출석체크
1번째 줄에 학생의 수 N, 졸고 있는 학생의 수 K, 지환이가 출석 코드를 보낼 학생의 수 Q, 주어질 구간의 수 M이 주어진다. (1 ≤ K, Q ≤ N ≤ 5,000, 1 ≤ M ≤ 50,000) 2번째 줄과 3번째 줄에 각각 K명
www.acmicpc.net
풀이 코드 1
- 처음엔 출석 학생부터 누적합을 어떻게 활용해야 하나 고민했는데, 누적합에 대한 개념이 제대로 안섰나보다.
- 구간 M <= 50000 이므로 미참석자수를 표시 할 때 아래와 같은 코드로 하면 시간초과
import sys input = sys.stdin.readline N, K, Q, M = map(int, input().split()) ks = set(map(int, input().split())) qs = set(map(int, input().split())) ms = [] for _ in range(M): s, e = map(int, input().split()) ms.append((s, e)) # 1. 출석 학생 표시 visited = [0] * (N + 3) for q in (qs - ks): for i in range(q, N + 3, q): if i not in ks: visited[i] = 1 # 2. 미참석자수 표시 for s, e in ms: print(visited[s:e+1].count(0))
풀이 코드 2
- 누적합 부분은 풀이 참고 했음.
- 이전의 visited[s:e+1].count 로 인해 이중 for 문과 같은 시간 복잡도를 가지지 않고,
- 누적합을 통해 for문 1개로 끝낼 수 있어 시간 초과에 걸리지 않는다.
import sys input = sys.stdin.readline N, K, Q, M = map(int, input().split()) ks = set(map(int, input().split())) qs = set(map(int, input().split())) ms = [] for _ in range(M): s, e = map(int, input().split()) ms.append((s, e)) # 1. 출석 학생 표시 visited = [0] * (N + 3) for q in (qs - ks): for i in range(q, N + 3, q): if i not in ks: visited[i] = 1 # 2. 미참석자 수 합치는 단계 -> 누적합 attend = [0] * (N + 3) for i in range(3, N + 3): if not visited[i]: attend[i] = attend[i-1] + 1 else: attend[i] = attend[i-1] # 3. 답 프린트 answer = [] for s, e in ms: answer.append(attend[e] - attend[s-1]) for a in answer: print(a)
'Algorithm PS👩🏻💻 > 백준' 카테고리의 다른 글
[백준] 21314번: 민겸 수(Python) (0) 2023.05.14 [백준] 2615번: 오목 (완전탐색, Python) (0) 2023.05.10 [백준] 2887번: 행성 터널(그래프, Python) (1) 2023.05.10 [백준] 22858번: 원상 복구 (small) (Python) (0) 2023.05.07 [백준] 1541번: 잃어버린 괄호 (Python) (1) 2023.04.23