ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 10025 게으λ₯Έ λ°±κ³° with Python
    PS 2023. 4. 10. 14:07
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 10025 게으λ₯Έ λ°±κ³°

    πŸ’‘ 쑰건

    1. μ•¨λ²„νŠΈκ°€ κ°€μž₯ 적은 거리만 움직이고도 μ΅œλŒ€ν•œ λ§Žμ€ μ–ΌμŒμœΌλ‘œ λ”μœ„λ₯Ό μ‹νž 수 μžˆλ„λ‘ λ„μ™€μ£Όμž.

    2. 우리 μ•ˆμ€ 1차원 λ°°μ—΄λ‘œ μƒκ°ν•˜λ©°, 총 N개의 μ–ΌμŒ 양동이듀이 xiμ’Œν‘œλ§ˆλ‹€ 놓여 있고 각 양동이 μ•ˆμ—λŠ” giμ”©μ˜ μ–ΌμŒμ΄ λ“€μ–΄ μžˆλ‹€.
      (1 ≀ N ≀ 100000)
      (0 ≀ xi ≀ 1,000,000)
      (1 ≀ gi ≀ 10,000)

    3. μ•¨λ²„νŠΈκ°€ 자리λ₯Ό 작으면 κ·Έλ‘œλΆ€ν„° 쒌우둜 K(1 ≀ K ≀ 2,000,000) 만큼 떨어진 μ–‘λ™μ΄κΉŒμ§€ 닿을 수 μžˆλ‹€.
      μ•¨λ²„νŠΈλŠ” 양동이가 놓여 μžˆλŠ” μžλ¦¬μ—λ„ μžλ¦¬μž‘μ„ 수 μžˆλ‹€.
      λͺ¨λ“  μ–ΌμŒ μ–‘λ™μ΄μ˜ μœ„μΉ˜λŠ” λ‹€λ₯΄λ‹€.

    4. μ•¨λ²„νŠΈκ°€ 졜적의 자리λ₯Ό κ³¨λžμ„ λ•Œ μ–ΌμŒμ˜ 합을 κ΅¬ν•˜λŠ” 문제. 즉, μ–ΌμŒλ“€μ˜ ν•©μ˜ μ΅œλŒ“κ°’μ„ ꡬ해야 ν•œλ‹€.

    5. 첫 쀄에 μ •μˆ˜ Nκ³Ό Kκ°€ λ“€μ–΄μ˜¨λ‹€.
      λ‘˜μ§Έ 쀄뢀터 Nμ§Έ μ€„κΉŒμ§€, 곡백을 사이에 두고 각 μ–‘λ™μ΄μ˜ μ–ΌμŒμ˜ 양을 λ‚˜νƒ€λ‚΄λŠ” gi와 μ–‘λ™μ΄μ˜ μ’Œν‘œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” xiκ°€ 주어진닀.

    6. λˆ„μ ν•©, μŠ¬λΌμ΄λ”© μœˆλ„μš° μœ ν˜•μ˜ 문제

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

    예제 1

    4 3
    4 7
    10 15
    2 2
    5 1

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

    11

    ⌨️ 문제 풀이

    1. 이 λ¬Έμ œλŠ” 두 가지 풀이λ₯Ό ν•  수 μžˆλŠ”λ°, λ‚˜λŠ” μŠ¬λΌμ΄λ”© μœˆλ„μš°λ‘œ ν’€μ΄ν–ˆλ‹€.

    2. λˆ„μ ν•© ν’€μ΄λŠ” μ•„λž˜μ˜ 링크λ₯Ό μ°Έκ³ ν•˜λ©΄ 쒋을 것 κ°™λ‹€.
      10025 λˆ„μ ν•© 풀이

    3. μŠ¬λΌμ΄λ”© μœˆλ„μš°λ‘œ 문제λ₯Ό ν’€μ΄ν•˜κΈ° μœ„ν•΄μ„œ μ–ΌμŒμ–‘λ™μ΄λ“€μ΄ λ†“μ—¬μ§ˆ 배열을 λ§Œλ“€μ–΄μ€€λ‹€.
      1,000,000 개의 배열을 λ§Œλ“€μ–΄λ‘κ³ , N개의 μ–ΌμŒμ–‘λ™μ΄λ₯Ό X의 μœ„μΉ˜μ— Gλ₯Ό μ €μž₯ν•œλ‹€.

    4. (3)λ²ˆμ„ μ§„ν–‰ν•˜λ©΄μ„œ, λΆˆν•„μš”ν•œ 연산을 쀄이기 μœ„ν•΄ 양동이가 놓여진 맨 λ‚˜μ€‘ μ’Œν‘œλ₯Ό κ΅¬ν•œλ‹€.

    1. ν˜„μž¬ μœ„μΉ˜λ‘œλΆ€ν„° 쒌우둜 K 만큼 닿을 수 있기 λ•Œλ¬Έμ— 0 μ’Œν‘œλ₯Ό κΈ°μ€€μœΌλ‘œ 식 λ‹€μŒ μœ„μΉ˜λ₯Ό κ³„μ‚°ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.
      p = k * 2 + 1

    2. μ–ΌμŒλ“€μ˜ μ΅œλŒ€κ°’μ„ μ €μž₯ν•  res 의 μ΄ˆκΈ°κ°’μ€ 0~p κΉŒμ§€μ˜ 값이고, (3)μ—μ„œ κ΅¬ν•œ 맨 λ‚˜μ€‘ μ’Œν‘œκΉŒμ§€ μˆœνšŒν•˜λ©΄μ„œ res의 값을
      κ°±μ‹ ν•΄μ£Όλ©΄ λœλ‹€.

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

    from sys import stdin
    
    n, k = map(int, stdin.readline().split())
    length, ans = 0, 0
    arr = [0 for _ in range(10000001)]
    
    for _ in range(n):
        g, x = map(int, stdin.readline().split())
        length = max(length, x)
        arr[x] = g
    
    p = k * 2 + 1
    res = sum(arr[:p])
    ans = res
    
    for i in range(p, length + 1):
        # μ—¬κΈ° p κ°’ μ•ˆλ„£κ³  μˆ˜μ‹ 넣을 λ–„ κ΄„ν˜Έ μ•ˆ λ„£μ–΄μ„œ ν‹€λ ΈμŒ
        res += (arr[i] - arr[i - p])
        ans = max(ans, res)
    
    print(ans)
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.