[λ°±μ€€] 28303 μžμ„ (+ 연속 κ΅¬κ°„μ˜ μ΅œλŒ€ ν•©) (python 파이썬)

2023. 7. 5. 15:01·🧩 Problem Solving/[λ°±μ€€]

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

 

28303번: μžμ„

예제 1의 경우 N극이 3번 칸에 놓이고 S극이 5번 칸에 놓이도둝 μžμ„μ„ μ„€μΉ˜ν•  λ•Œ 1번 ν˜„μƒμœΌλ‘œ $a_3=22$의 μ—λ„ˆμ§€κ°€ μΆ©μ „λ˜λ©°, 2번 ν˜„μƒμœΌλ‘œ $a_5=4$의 μ—λ„ˆμ§€κ°€ μ†Œλͺ¨λ˜κ³ , 3번 ν˜„μƒμœΌλ‘œ $(5-3)\times 2=4$

www.acmicpc.net


N의 μ΅œλŒ“κ°’μ΄ 500,000이닀. μ‹œκ°„μ œν•œμ€ 2μ΄ˆλ‚˜ λ˜μ§€λ§Œ, N**2 같은 건 μ ˆλŒ€ μ•ˆ λœλ‹€.

이런 κ±Έ κ³ λ €ν•΄μ„œ μ²˜μŒμ—λŠ” DP, 그리디, λˆ„μ  ν•©, νˆ¬ν¬μΈν„° λ“±λ“± μƒκ°ν–ˆμ—ˆλŠ”λ° 1μ‹œκ°„ 정도 아이디어도 μ•ˆ λ‚˜μ™”λ‹€.

 

κ²°κ΅­ μ•Œκ³ λ¦¬μ¦˜ λΆ„λ₯˜λ₯Ό ν™•μΈν–ˆλ‹€. λˆ„μ  ν•© 인걸 ν™•μΈν•˜κ³  μ΅œλŒ€ν•œ λˆ„μ  ν•© μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•˜λ €κ³  ν–ˆλ‹€.

μ½”λ“œ μž‘μ„± 쀑간에 λ‚΄κ°€ μ›ν•˜λŠ” λ‘œμ§μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ 인터넷 검색도 μ‚¬μš©ν–ˆλ‹€.

 

μ‹€μ œ ν…ŒμŠ€νŠΈ ν™˜κ²½μ΄μ—ˆλ‹€λ©΄ λͺ» ν’€μ—ˆμ„ κ±° κ°™λ‹€.  

ν•˜μ§€λ§Œ κ²½ν—˜μ„ μŒ“μœΌλ©΄ μΆ©λΆ„νžˆ ν•΄κ²°ν• λ§Œν•œ 문제 λ‚œμ΄λ„λΌκ³  μƒκ°ν•œλ‹€. 긍정적인 λŠλ‚Œμ„ λ°›μ•˜λ‹€.

 

1. 문제λ₯Ό ν•΄κ²°ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ λŒ€ν•œ ν™•μ‹  (κ²½ν—˜)

2. 쀑간쀑간 μ›ν•˜λŠ” λ‘œμ§μ„ κ΅¬ν˜„ν•  λŠ₯λ ₯ (κ²½ν—˜)


아이디어

이것저것 μ μ–΄λ³΄λ©΄μ„œ κ·œμΉ™ 찾아보렀고 ν–ˆλ‹€.

f(1, 2) + f(2, 3) = f(1, 3) 같은 λŠλ‚Œμ˜ κ·œμΉ™μ„ λ°œκ²¬ν•˜κ³  μˆ˜μ‹μœΌλ‘œ 써봀닀.

NS λ°©ν–₯을 κ³ μ •ν•œλ‹€λŠ” μ „μ œν•˜μ— ꡬ간 a, b에 λŒ€ν•΄μ„œ λ°°ν„°λ¦¬μ˜ μ—λ„ˆμ§€ 변화값을 κ΅¬ν•˜λŠ” ν•¨μˆ˜ fλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

f(a, b) = A(a) - A(b) - (b - a) * K // (A(i)λŠ” i번칸 μ—λ„ˆμ§€ μƒμˆ˜, a, bλŠ” 번호 | a < b)

 

μ—¬κΈ° fλΌλŠ” ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같은 쑰건을 λ§Œμ‘±ν•œλ‹€.

 

f(a, b) + f(b, c)

= A(a) - A(b) - (b - a) * K + A(b) - A(c) - (c - a) * K

= A(a) - A(c) - (a - c) * K

= f(a, c) //(a < b < c)

 

∴ f(a, b) + f(b, c) = f(a, c)

 

μœ„μ™€ 같은 ν•¨μˆ˜μ˜ νŠΉμ§•μ„ λœ»ν•˜λŠ” μš©μ–΄λ₯Ό μ΄μ‚°μˆ˜ν•™ 같은 학ꡐ μˆ˜μ—…μ— 배운 κ±° 같은데 잘 기얡이 λ‚˜μ§ˆ μ•ŠλŠ”λ‹€. ν˜Ήμ‹œ μ•„λŠ” 뢄은 μ•Œλ €μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

f의 μ„±μ§ˆμ„ μ΄μš©ν•΄ 번호 차이가 1인걸 κΈ°μ€€μœΌλ‘œ 배열을 μž‘μ„±ν•œλ‹€. 예) [f(1,2), f(2,3), f(3,4), f(4,5)]

이 배열을 μ΄μš©ν•˜λ©΄ μžμ„ λ°©ν–₯이 NS일 λ•Œμ˜ λͺ¨λ“  μ—λ„ˆμ§€ 변화값을 ꡬ할 수 μžˆλ‹€.

μš°λ¦¬λŠ” μ΅œλŒ“κ°’μ„ ꡬ할 κ±°λ‹ˆκΉŒ 이 λ°°μ—΄μ˜ 연속 κ΅¬κ°„μ˜ μ΅œλŒ€ 합을 ꡬ해주면 λœλ‹€.

 

SNλ°©ν–₯도 μœ„μ˜ λ°©λ²•μœΌλ‘œ κ΅¬ν•˜λ©΄ λœλ‹€. μ΅œμ’…μ μœΌλ‘œ NS의 μ΅œλŒ“κ°’, SN의 μ΅œλŒ“κ°’μ„ λΉ„κ΅ν•΄μ„œ 좜λ ₯ν•˜λ©΄ λœλ‹€.


전체 μ½”λ“œ

N, K = map(int, input().split())

tables = [int(x) for x in input().split()]

arr_NS = []
arr_SN = []

for i in range(1, N): # N-S
    arr_NS.append(tables[i - 1] - tables[i] - K)

for i in range(1, N): # S-N
    arr_SN.append(tables[i] - tables[i - 1] - K)

temp_NS = [0] * (N - 1)
temp_NS[0] = arr_NS[0]
for i in range(1, N - 1):
    temp_NS[i] = max(0, temp_NS[i - 1]) + arr_NS[i]

temp_SN = [0] * (N - 1)
temp_SN[0] = arr_SN[0]
for i in range(1, N - 1):
    temp_SN[i] = max(0, temp_SN[i - 1]) + arr_SN[i]

print(max((max(temp_NS),max(temp_SN))))

μ½”λ“œ μ„€λͺ…

for i in range(1, N): # N-S
    arr_NS.append(tables[i - 1] - tables[i] - K)

arr_NSλŠ” λ°©ν–₯은 NS(N이 μ™Όμͺ½), μœ„μ—μ„œ λ§ν•œ 번호 μ°¨κ°€ 1일 λ•Œ, 즉 μžμ„μ˜ 길이가 2일 λ•Œ μ—λ„ˆμ§€ 변화값듀이닀. 

 

temp_NS = [0] * (N - 1)
temp_NS[0] = arr_NS[0]
for i in range(1, N - 1):
    temp_NS[i] = max(0, temp_NS[i - 1]) + arr_NS[i]

λ°°μ—΄μ˜ 연속 κ΅¬κ°„μ˜ μ΅œλŒ€ 합을 κ΅¬ν•˜λŠ” μ½”λ“œλ‹€. 동적 κ³„νšλ²•(dp)으둜 κ΅¬ν˜„ν–ˆλ‹€. μ‹œκ°„λ³΅μž‘λ„λŠ” O(n)이닀.

μ•žμ—μ„œλΆ€ν„° μ­‰ λ”ν•˜λ‹€κ°€ 합이 μŒμˆ˜κ°€ λ‚˜μ˜€λ©΄ μ•žμ˜ 뢀뢄을 λ²„λ¦¬λŠ” 방식이닀. 

 

print(max((max(temp_NS),max(temp_SN))))

SN도 같은 λ°©λ²•μœΌλ‘œ ꡬ해주고, μ΅œλŒ“κ°’μ„ 좜λ ₯ν•˜λ©΄ λœλ‹€.

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)

'🧩 Problem Solving > [λ°±μ€€]' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ°±μ€€] 2447 별 찍기 - 10 (python 파이썬)  (0) 2023.07.30
[λ°±μ€€] 28018 μ‹œκ°„μ΄ 겹칠까?(feat.imos법) (python 파이썬)  (0) 2023.07.18
[λ°±μ€€] 28286 μž¬μ±„μ μ„ κΈ°λ‹€λ¦¬λŠ” 쀑 (python 파이썬)  (0) 2023.07.05
[λ°±μ€€] 28298 더 ν”ν•œ 타일 색칠 문제 (python 파이썬)  (0) 2023.07.04
[λ°±μ€€] 28250 이브, ν”„μ‹œμΌ€ 그리고 ν‘Έλ₯Έ MEX의 μ•„λ‚΄ (C++ cpp)  (0) 2023.07.03
'🧩 Problem Solving/[λ°±μ€€]' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [λ°±μ€€] 2447 별 찍기 - 10 (python 파이썬)
  • [λ°±μ€€] 28018 μ‹œκ°„μ΄ 겹칠까?(feat.imos법) (python 파이썬)
  • [λ°±μ€€] 28286 μž¬μ±„μ μ„ κΈ°λ‹€λ¦¬λŠ” 쀑 (python 파이썬)
  • [λ°±μ€€] 28298 더 ν”ν•œ 타일 색칠 문제 (python 파이썬)
μ œλ΄‰μ•„
μ œλ΄‰μ•„
  • μ œλ΄‰μ•„
    Overthinking
    μ œλ΄‰μ•„
    fake it till you make it.
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (104)
      • 🧩 Problem Solving (83)
        • [λ°±μ€€] (74)
        • [ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] (7)
        • [SW Expert Academy] (1)
        • [μ•Œκ³ λ¦¬μ¦˜ for PS] (1)
      • πŸ“¦ Data Structure (2)
      • πŸ“œ Language (14)
        • [python] (14)
      • πŸ–€ Git (1)
      • πŸŒ† 일상 (2)
        • πŸ’¬ 벽보고 λ§ν•˜κΈ° (2)
      • πŸ—„οΈ 기타 (2)
      • πŸ”΅ css (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    λ°λΈŒμ½”μŠ€
    μž¬κ·€
    μ •μ²˜κΈ°
    slicing
    SWEA
    κ΅¬ν˜„
    λΆ€λΆ„ν•©
    DP
    λ°±μ€€
    ν”Œλ‘œμ΄λ“œ 와샬
    λ‹€μ΅μŠ€νŠΈλΌ
    λ°±νŠΈλž˜ν‚Ή
    ν”Œλ‘œμ΄λ“œμ›Œμ…œ
    그리디
    νŒ°λ¦°λ“œλ‘¬
    νˆ¬ν¬μΈν„°
    Python
    냅색
    μœ„μƒμ •λ ¬
    boj
    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
    μŠ€νƒ
    브루트포슀
    imos
    DFS
    λˆ„μ ν•©
    λΆ„ν•  정볡
    파이썬
    Bruteforce
    BFS
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
μ œλ΄‰μ•„
[λ°±μ€€] 28303 μžμ„ (+ 연속 κ΅¬κ°„μ˜ μ΅œλŒ€ ν•©) (python 파이썬)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”