PS

[λ°±μ€€] 10025 게으λ₯Έ λ°±κ³° with Python

ν˜•μ€€_It's 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)
λ°˜μ‘ν˜•