ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo RhythmπŸ•ΊπŸ’ƒ]BOJ 14501 - 퇴사
    Algo RhythmπŸ•ΊπŸ’ƒ/BOJ 2021. 3. 11. 00:41

    λ¬Έμ œλΆ„μ„

    λ°±μ€€μ΄λŠ” $i (1 \le i \le N)$번째 λ‚ μ˜ 일을 ν•˜λŠλƒ λ§ˆλŠλƒμ— 따라 얻을 수 μžˆλŠ” 이읡이 λ‹€λ₯΄λ‹€. λ‹¨μˆœνžˆ μƒκ°ν•˜λ©΄ i번째 λ‚ μ˜ 일을 ν•˜λŠ” κ²½μš°μ™€ μ•ˆ ν•˜λŠ” 경우둜 λ‚˜λˆ μ„œ λͺ¨λ“  경우λ₯Ό μ‚΄ν•€ λ’€ κ·Έ 쀑 μ΅œλŒ€μ˜ 이읡을 κ΅¬ν•˜λ©΄ 될 것 κ°™λ‹€. 사싀 κ·Έλž˜λ„ λœλ‹€. ν•˜μ§€λ§Œ 쑰금 더 생각해보면 보닀 더 효율적인 방법이 μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

     

    μ•žμ„œ λ§ν–ˆλ“―μ΄ λ°±μ€€μ΄λŠ” i번째 λ‚ μ˜ 일을 ν•˜λŠλƒ λ§ˆλŠλƒμ— 따라 얻을 수 μžˆλŠ” 이읡이 λ‹€λ₯΄λ‹€. μžμ„Ένžˆ λ§ν•˜λ©΄ λ§Œμ•½ i번째 λ‚ μ˜ 일을 ν•œλ‹€λ©΄ $i + T[i]$번째 λ‚ μ˜ 일뢀터 ν•˜λŠλƒ λ§ˆλŠλƒλ₯Ό 선택할 수 있고 λ§Œμ•½ i번째 λ‚ μ˜ 일을 ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ $i + 1$번째 λ‚ μ˜ 일뢀터 ν•˜λŠλƒ λ§ˆλŠλƒλ₯Ό 선택할 수 μžˆλ‹€. 즉, 백쀀이가 i번째 λ‚ μ˜ 일을 ν•˜λŠλƒ λ§ˆλŠλƒλ₯Ό κ²°μ •ν•  수 μžˆλŠ” μƒν™©μ—μ„œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡은 i번째 λ‚ μ˜ 일을 μ„ νƒν–ˆμ„λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡과 i번째 λ‚ μ˜ 일을 μ„ νƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡 쀑 더 큰 값이닀.

     

    μš°λ¦¬λŠ” 이λ₯Ό 톡해 문제 해결에 연쇄적인 ꡬ쑰가 μžˆμŒμ„ μ•Œ 수 있고 μ΄λŠ” μ „ν˜•μ μΈ dynamic programming의 ν•΄κ²°λ°©λ²•μž„μ„ νŒŒμ•…ν•  수 μžˆλ‹€.

     

    문제 풀이

    문제 λΆ„μ„μ—μ„œ μ–ΈκΈ‰ν•œ '백쀀이가 i번째 λ‚ μ˜ 일을 ν•˜λŠλƒ λ§ˆλŠλƒλ₯Ό κ²°μ •ν•  수 μžˆλŠ” μƒν™©μ—μ„œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡은 i번째 λ‚ μ˜ 일을 μ„ νƒν–ˆμ„λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡과 i번째 λ‚ μ˜ 일을 μ„ νƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡 쀑 더 큰 κ°’'은 μ•„λž˜μ™€ 같은 μ ν™”μ‹μœΌλ‘œ ν‘œν˜„ν•  수 있고 $f(i)$의 값을 memoization table에 μ €μž₯ν•˜κ³  ν•„μš”ν•  λ•Œ λΆˆλŸ¬μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

     

    $f(i) = max\begin{cases}f(T[i] + i) + P[i]&if\ choose\ i^{th}\ day\\f(i+1)&if\ not\ choose\ i^{th}\ day\end{cases}​$

     

    점화식을 μž¬κ·€ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•˜κ³ λ‚˜μ„œ λ”°λ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” 두 가지 μ˜ˆμ™Έμƒν™©λ“€μ΄ μžˆλ‹€. ν•˜λ‚˜λŠ” i 번째 날이 백쀀이가 ν‡΄μ‚¬ν•˜λŠ” N + 1번째 날보닀 ν¬κ±°λ‚˜ 같은 상황이고 λ‹€λ₯Έ ν•˜λ‚˜λŠ” $T[i] + i - 1$ 일 즉, 백쀀이가 i번째 λ‚ μ˜ 일을 ν•˜κ³ λ‚˜μ„œ λ‹€μŒμœΌλ‘œ 일을 ν•  수 μžˆλŠ” 날이 N+1 일보닀 ν¬κ±°λ‚˜ 같은 상황이닀. 두 경우 λͺ¨λ‘ 0을 λ°˜ν™˜ν•΄μ„œ μ΅œλŒ€ 이읡을 κ΅¬ν•˜λŠ”λ° 영ν–₯을 받지 μ•Šλ„λ‘ ν•œλ‹€.

     

    λ³΅μž‘λ„ 뢄석

    백쀀이가 λ§ˆμ§€λ§‰μœΌλ‘œ μΌν•˜λŠ” 날을 N번째 날이라고 ν•˜μž. μ΄λ•Œ μ‹œκ°„λ³΅μž‘λ„μ™€ κ³΅κ°„λ³΅μž‘λ„λŠ” μ•„λž˜μ™€ κ°™λ‹€.

     

    μ‹œκ°„ λ³΅μž‘λ„ : $O(n)$

    이유 : μž¬κ·€ν•¨μˆ˜μ—μ„œ memoization table에 κΈ°λ‘λ˜μ§€ μ•Šμ€ 날듀은 λͺ¨λ‘ 호좜되고 기둝된 날듀은 μƒμˆ˜ μ‹œκ°„μ•ˆμ— 값을 λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ—

     

    곡간 λ³΅μž‘λ„ : $O(n)$

    이유 : $T_i$와 $P_i$λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄κ³Ό memoization table에 λͺ¨λ‘ n개의 곡간이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ—

     

    μ½”λ“œ

     

    문제 μΆœμ²˜μ™€ 원본 λ¬Έμ„œ

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

     

    14501번: 퇴사

    첫째 쀄에 백쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡을 좜λ ₯ν•œλ‹€.

    www.acmicpc.net

    www.notion.so/BOJ-14501-09a20ed4797748d9a90dcebe85dcaf9f

     

    BOJ 14501 - 퇴사

    문제 뢄석

    www.notion.so

    λŒ“κΈ€

Designed by Tistory.