[Python][백준] 20438번 출석체크

신남·2023년 1월 27일

https://www.acmicpc.net/problem/20438

공부 날짜 : 2023.01.26~2023.01.27
정답 참조 여부 : O

출석번호를 랜덤으로 부를때 호출된 학생은 자신의 배수인 학생에게 모두 출석을 부른다.
이때 잠든 학생은 출석에 답을 못했을때
특정 영역에서 출석에 답하지 못한 학생을 구하는 문제이다.


문제를 제대로 이해하지못해서 엄청나게 해맸던 문제이다.

처음에는 출석에 답한 학생을 구하다가 예제입력과 출력 다른거보고 계속 디버깅해보다가 문제를 잘못이해했음을 알았다. 이때 이미 멘탈이 많이 흔들렸는데 가장 결정적인 내용을 잘못 이해하고 있었다.

3번 학생이 불리면 3,6,9,12,15,18 계속해서 부르는게 맞고 15번이 답을 안했어도 계속 불러야 한다. 하지만, 15번이 자고 있으면 12번까지만 부른다고 생각해서 엄청 해맸다.

문제를 잘못이해 했기때문에 출석에 답한 학생들을 계속해서 heap구조에 넣고 출석을 부르는 반복을 넣어줄뻔하다가 너무 복잡해져서 포기하고 정답을 본거였는데

정답을 참조 했을때까지만 해도 문제를 잘못 이해하고 이렇게 풀면 안되지 않나?? 이러고 있었다.....코드를 보고 뜯어보다가 그제야 이해하고 답을 수정했다.

문제풀이가 이상하면 문제를 정확히 이해했는지 다시한번 봐야겠다.

소스코드

import sys
input = sys.stdin.readline
###########################################
# 입력데이터 정보 받아오기
n, k, q, m = map(int, input().split())

# 자는 학생 저장하기
# n+2까지 숫자가 index로 들어가야 하므로 길이는 n+3
sleep = [False for _ in range(n+3)]
for i in map(int, input().split()):
    sleep[i] = True

check = [1 for _ in range(n+3)]

for i in map(int, input().split()):
    if sleep[i]:
        continue

    for j in range(i, n+3, i):
        if sleep[j]:
            continue

        check[j] = 0

sum_ = 0
check[2] = 0
for i in range(3, n+3):
    if check[i]:
        sum_ += 1

    check[i] = sum_

for _ in range(m):
    s, e = map(int, input().split())
    print(check[e] - check[s-1])

0개의 댓글