본문 바로가기
Beakjoon&프로그래머스/파이썬

[백준/파이썬] 20438번 출석체크

by 현장 2022. 5. 13.

-Code

 

1. 처음코드

n, k, q, m = map(int, input().split())
sleep = list(map(int, input().split()))
code_take = list(map(int, input().split()))
for _ in range(m):
    s, e = map(int, input().split())
    students = [i for i in range(s, e + 1)]
    for i in code_take:
        for j in range(i, e + 1, i):
            if j not in students:
                continue
            if j not in sleep:
                students.remove(j)
    print(len(students))

처음에 위와 같이 작성하고 예시 입출력은 맞았으나 이유는 모르겟으나 틀려서 찾아보니 딱히 정보가 없어서 다른 코드로 바꿔야 했습니다.

 

2. 고친코드

import sys
input = sys.stdin.readline

n, k, q, m = map(int, input().split())
sleep = list(map(int, input().split()))
code_take = list(map(int, input().split()))
sleep_check = [0] * (n + 3)
take_check = [0] * (n + 3)
for i in sleep:
    sleep_check[i] = 1
for take in code_take:
    if sleep_check[take]:
        continue
    for i in range(take, n + 3, take):
        if i not in sleep:
            take_check[i] = 1
dp = [take_check[0]]
for i in range(1, n + 3):
    dp.append(dp[i - 1] + take_check[i])
for _ in range(m):
    s, e = map(int, input().split())
    print(e - s + 1 - (dp[e] - dp[s - 1]))

그래서 다른 코드는 sleep에 있는 수일 경우는 패스하고 다른 경우 전부 1로 바꿔주고 s, e에 따라서 바꾸는 코드인데 출력할때 그냥 e - s - (dp[e] - dp[s])로하야사 틀렸니다. 그래서 생각해보니 범위문에 문제가 생긴 거같아서 찾이서 바로 잡하서 해결은 했습니다. 하지만 정확히 문제점을 모르고 첫 시도 이후 많이 찾아봐서 아쉬웠습니다.