ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 20438 μΆœμ„μ²΄ν¬ with Python
    PS 2022. 6. 5. 16:01
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 20438 μΆœμ„μ²΄ν¬

    πŸ’‘ 쑰건

    1. 학생듀은 접속 μˆœμ„œλŒ€λ‘œ 3λ²ˆλΆ€ν„° N + 2λ²ˆκΉŒμ§€ μž…μž₯ 번호λ₯Ό λ°›κ²Œ λœλ‹€.

    2. μ§€ν™˜μ΄κ°€ ν•œ ν•™μƒμ—κ²Œ μΆœμ„ μ½”λ“œλ₯Ό λ³΄λ‚΄κ²Œ 되면, ν•΄λ‹Ή 학생은 본인의 μž…μž₯ 번호의 배수인 ν•™μƒλ“€μ—κ²Œ μΆœμ„ μ½”λ“œλ₯Ό 보내어
      ν•΄λ‹Ή κ°•μ˜μ˜ μΆœμ„μ„ ν•  수 μžˆκ²Œλ” ν•œλ‹€. ν•˜μ§€λ§Œ, Kλͺ…μ˜ μ‘Έκ³  μžˆλŠ” 학생듀은 μΆœμ„ μ½”λ“œλ₯Ό μ œμΆœν•˜μ§€ μ•Šκ³ , λ‹€λ₯Έ ν•™μƒλ“€μ—κ²Œ 보내지 μ•ŠλŠ”λ‹€.

    1. μ§€ν™˜μ΄λŠ” λ¬΄μž‘μœ„λ‘œ ν•œ λͺ…μ˜ ν•™μƒμ—κ²Œ μΆœμ„ μ½”λ“œλ₯Ό λ³΄λ‚΄λŠ” ν–‰μœ„λ₯Ό Q번 λ°˜λ³΅ν•œ λ’€,
      μΆœμ„λΆ€ 정리λ₯Ό μœ„ν•΄ νŠΉμ • κ΅¬κ°„μ˜ μž…μž₯ 번호λ₯Ό 받은 학생듀 μ€‘μ—μ„œ μΆœμ„μ΄ λ˜μ§€ μ•Šμ€ ν•™μƒλ“€μ˜ 수λ₯Ό κ΅¬ν•˜κ³  μ‹Άλ‹€.
    1. 1번째 쀄에 ν•™μƒμ˜ 수 N, μ‘Έκ³  μžˆλŠ” ν•™μƒμ˜ 수 K, μ§€ν™˜μ΄κ°€ μΆœμ„ μ½”λ“œλ₯Ό 보낼 ν•™μƒμ˜ 수 Q, μ£Όμ–΄μ§ˆ κ΅¬κ°„μ˜ 수 M이 주어진닀.
      (1 ≀ K, Q ≀ N ≀ 5,000, 1 ≀ M ≀ 50,000)
    1. 2번째 쀄과 3번째 쀄에 각각 Kλͺ…μ˜ μ‘Έκ³  μžˆλŠ” ν•™μƒμ˜ μž…μž₯ λ²ˆν˜Έλ“€κ³Ό Qλͺ…μ˜ μΆœμ„ μ½”λ“œλ₯Ό 받을 ν•™μƒμ˜ μž…μž₯ λ²ˆν˜Έλ“€μ΄ 주어진닀.
    1. 4번째 쀄뢀터 M개의 쀄 λ™μ•ˆ κ΅¬κ°„μ˜ λ²”μœ„ S, Eκ°€ 곡백을 사이에 두고 주어진닀. (3 ≀ S < E ≀ N + 2)
    1. λˆ„μ ν•©, κ΅¬ν˜„ μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin
    
    n, k, q, m = map(int, stdin.readline().split())
    sleep = [0 for _ in range(n + 3)]
    check = [0 for _ in range(n + 3)]
    
    for i in map(int, stdin.readline().split()):
        sleep[i] = 1
    
    for i in map(int, stdin.readline().split()):
        if sleep[i]:
            continue
    
        for j in range(i, n + 3, i):
            if not sleep[j]:
                check[j] = 1
    
    pre = [check[0]]
    for i in range(1, n + 3):
        pre.append(pre[-1] + check[i])
    
    for _ in range(m):
        s, e = map(int, stdin.readline().split())
        print(e - s + 1 - pre[e] - pre[s - 1])

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    50 4 5 1
    24 15 27 43
    3 4 6 20 25
    3 52

    μ‹€ν–‰κ²°κ³Ό

    25

    ⌨️ 문제 풀이

    1. μžλŠ” 인원을 λ¨Όμ € sleep λ¦¬μŠ€νŠΈμ— ν‘œμ‹œν•΄μ€€λ‹€.
      κ·Έ ν›„, ν•΄λ‹Ή ꡬ간에 λŒ€ν•΄ μΆœμ„μ²΄ν¬λ₯Ό μ •μƒμ μœΌλ‘œ ν•œ 인원에 λŒ€ν•΄μ„œ ꡬ간합을 ꡬ해쀀닀.
    1. λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” ꡬ간에 λŒ€ν•΄μ„œ κ΅¬κ°„μ˜ 합을 κ΅¬ν•΄μ„œ 좜λ ₯ν•œλ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.