😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[BAEKJOON C++] 23291_μ–΄ν•­ 정리 λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON C++] 23291_μ–΄ν•­ 정리

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 8. 18. 13:59
728x90
λ°˜μ‘ν˜•
πŸ’› 문제
λ§ˆλ²•μ‚¬ μƒμ–΄λŠ” κ·Έλ™μ•ˆ λ°°μš΄ λ§ˆλ²•μ„ μ΄μš©ν•΄ μ–΄ν•­μ„ μ •λ¦¬ν•˜λ €κ³  ν•œλ‹€. 
어항은 μ •μœ‘면체 λͺ¨μ–‘이고, ν•œ λ³€μ˜ κΈΈμ΄λŠ” λͺ¨λ‘ 1이닀. 
상어가 κ°€μ§€κ³  μžˆλŠ” μ–΄ν•­μ€ N개이고, κ°€μž₯ μ²˜μŒμ— μ–΄ν•­μ€ μΌλ ¬λ‘œ λ°”λ‹₯ μœ„에 λ†“μ—¬μ Έ μžˆλ‹€. 
μ–΄ν•­μ—λŠ” λ¬Όκ³ κΈ°κ°€ ν•œ λ§ˆλ¦¬ μ΄μƒ λ“€μ–΄μžˆλ‹€. 

<κ·Έλ¦Ό 1>은 μ–΄ν•­ 8κ°œκ°€ λ°”λ‹₯ μœ„에 λ†“μ—¬μžˆλŠ” μƒνƒœμ΄λ©°, 
칸에 μ νžŒ κ°’은 κ·Έ μ–΄ν•­μ— λ“€μ–΄μžˆλŠ” λ¬Όκ³ κΈ°μ˜ μˆ˜μ΄λ‹€. νŽΈμ˜μƒ μ–΄ν•­μ€ μ •μ‚¬κ°ν˜•μœΌλ‘œ ν‘œν˜„ν–ˆλ‹€.
=> 5, 2, 3, 14, 9, 2, 11, 8

어항을 ν•œ λ²ˆ μ •λ¦¬ν•˜λŠ” κ³Όμ •μ€ λ‹€μŒκ³Ό κ°™μ΄ μ΄λ£¨μ–΄μ Έ μžˆλ‹€.

λ¨Όμ €, λ¬Όκ³ κΈ°μ˜ μˆ˜κ°€ κ°€μž₯ μ μ€ μ–΄ν•­μ— λ¬Όκ³ κΈ°λ₯Ό ν•œ λ§ˆλ¦¬ λ„£λŠ”λ‹€.
λ§Œμ•½, κ·ΈλŸ¬ν•œ μ–΄ν•­μ΄ μ—¬λŸ¬κ°œλΌλ©΄ λ¬Όκ³ κΈ°μ˜ μˆ˜κ°€ μ΅œμ†ŒμΈ μ–΄ν•­ λͺ¨λ‘μ— ν•œ λ§ˆλ¦¬μ”© λ„£λŠ”λ‹€. 
μœ„μ˜ μ˜ˆμ‹œμ˜ κ²½μš° λ¬Όκ³ κΈ°μ˜ μˆ˜κ°€ κ°€μž₯ μ μ€ μ–΄ν•­μ—λŠ” λ¬Όκ³ κΈ°κ°€ 2마리 μžˆκ³ , κ·ΈλŸ¬ν•œ μ–΄ν•­μ€ 2κ°œκ°€ μžˆλ‹€.
λ”°λΌμ„œ, 2개의 μ–΄ν•­μ— λ¬Όκ³ κΈ°λ₯Ό ν•œ λ§ˆλ¦¬μ”© λ„£μ–΄ <κ·Έλ¦Ό 2>와 κ°™μ•„진닀.
=> 5, 3, 3, 14, 9, 3, 11, 8

이제 μ–΄ν•­μ„ μŒ“λŠ”λ‹€. λ¨Όμ €, κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ–΄ν•­μ„ κ·Έ μ–΄ν•­μ˜ μ˜€λ₯Έμͺ½μ— μžˆλŠ” μ–΄ν•­μ˜ μœ„에 μ˜¬λ € λ†“μ•„ <κ·Έλ¦Ό 3>이 λœλ‹€.
=> 5, 
=> 3, 3, 14, 9, 3, 11, 8

이제, 2개 μ΄μƒ μŒ“μ—¬μžˆλŠ” μ–΄ν•­μ„ λͺ¨λ‘ κ³΅μ€‘ λΆ€μ–‘μ‹œν‚¨ λ‹€μŒ, μ „체λ₯Ό μ‹œκ³„λ°©ν–₯으둜 90도 νšŒμ „μ‹œν‚¨λ‹€. 
이후 κ³΅μ€‘ λΆ€μ–‘μ‹œν‚¨ μ–΄ν•­μ„ λ°”λ‹₯에 μžˆλŠ” μ–΄ν•­μ˜ μœ„에 μ˜¬λ €λ†“λŠ”λ‹€. 
=> 3, 5, 
=> 3, 14, 9, 3, 11, 8
λ°”λ‹₯의 κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ–΄ν•­ μœ„에 κ³΅μ€‘ λΆ€μ–‘μ‹œν‚¨ μ–΄ν•­ μ€‘ κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ–΄ν•­μ΄ μžˆμ–΄μ•Ό ν•œλ‹€. 
이 μž‘업은 κ³΅μ€‘ λΆ€μ–‘μ‹œν‚¨ μ–΄ν•­ μ€‘ κ°€μž₯ μ˜€λ₯Έμͺ½μ— μžˆλŠ” μ–΄ν•­μ˜ μ•„λž˜μ— λ°”λ‹₯에 μžˆλŠ” μ–΄ν•­μ΄ μžˆμ„λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.
λ¨Όμ €, <κ·Έλ¦Ό 4>와 κ°™μ΄ μ–΄ν•­μ΄ λ†“인 μƒνƒœκ°€ λ³€ν•˜κ³ , ν•œ λ²ˆ λ” λ³€ν•΄μ„œ <κ·Έλ¦Ό 5>κ°€ λœλ‹€.
=> 3, 3, 
=> 14, 5, 
=> 9, 3, 11, 8

<κ·Έλ¦Ό 5>μ—μ„œ ν•œ λ²ˆ λ” μ–΄ν•­μ„ κ³΅μ€‘ λΆ€μ–‘μ‹œν‚€λŠ” κ²ƒμ€ λΆˆκ°€λŠ₯ν•˜λ‹€. 
κ·Έ μ΄μœ λŠ” <κ·Έλ¦Ό 6>κ³Ό κ°™μ΄ κ³΅μ€‘ λΆ€μ–‘μ‹œν‚¨ μ–΄ν•­ μ€‘ κ°€μž₯ μ˜€λ₯Έμͺ½μ— μžˆλŠ” μ–΄ν•­μ˜ μ•„λž˜μ— λ°”λ‹₯에 μžˆλŠ” μ–΄ν•­μ΄ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.
=> 9, 14, 3
=> 3, 5, 3
=> 11, 8

곡쀑 λΆ€μ–‘ μž‘업이 λͺ¨λ‘ λλ‚˜λ©΄, μ–΄ν•­μ— μžˆλŠ” λ¬Όκ³ κΈ°μ˜ μˆ˜λ₯Ό μ‘°μ ˆν•œλ‹€.
λͺ¨λ“  μΈμ ‘ν•œ λ‘ μ–΄ν•­μ— λŒ€ν•΄μ„œ, λ¬Όκ³ κΈ° μˆ˜μ˜ μ°¨μ΄λ₯Ό κ΅¬ν•œλ‹€. 
이 μ°¨μ΄λ₯Ό 5둜 λ‚˜λˆˆ λͺ«μ„ d라고 ν•˜μž. dκ°€ 0보닀 ν¬λ©΄, λ‘ μ–΄ν•­ μ€‘ λ¬Όκ³ κΈ°μ˜ μˆ˜κ°€ λ§Žμ€ κ³³μ— μžˆλŠ” λ¬Όκ³ κΈ° d λ§ˆλ¦¬λ₯Ό μ μ€ κ³³μ— μžˆλŠ” κ³³μœΌλ‘œ λ³΄λ‚Έλ‹€.
이 κ³Όμ •μ€ λͺ¨λ“  μΈμ ‘ν•œ μΉΈμ— λŒ€ν•΄μ„œ λ™μ‹œμ— λ°œμƒν•œλ‹€. μ΄ κ³Όμ •μ΄ μ™„λ£Œλ˜λ©΄ <κ·Έλ¦Ό 7>이 λœλ‹€.
=> 5, 3
=> 10, 6
=> 9, 5, 10, 8

이제 λ‹€μ‹œ μ–΄ν•­μ„ λ°”λ‹₯에 μΌλ ¬λ‘œ λ†“μ•„μ•Ό ν•œλ‹€. κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ–΄ν•­λΆ€ν„°, κ·Έλ¦¬κ³  μ•„λž˜μ— μžˆλŠ” μ–΄ν•­λΆ€ν„° κ°€μž₯ μœ„에 μžˆλŠ” μ–΄ν•­κΉŒμ§€ μˆœμ„œλŒ€λ‘œ λ°”λ‹₯에 λ†“μ•„μ•Ό ν•œλ‹€. 
<κ·Έλ¦Ό 8>이 λ°”λ‹₯에 λ‹€μ‹œ μΌλ ¬λ‘œ λ†“은 μƒνƒœμ΄λ‹€.
=> 9, 10, 5, 5, 6, 3, 10, 8

λ‹€μ‹œ κ³΅μ€‘ λΆ€μ–‘ μž‘업을 ν•΄μ•Ό ν•œλ‹€. μ΄λ²ˆμ—λŠ” κ°€μš΄λ°λ₯Ό μ€‘μ‹¬μœΌλ‘œ μ™Όμͺ½ N/2개λ₯Ό κ³΅μ€‘ λΆ€μ–‘μ‹œμΌœ μ „체λ₯Ό μ‹œκ³„ λ°©ν–₯으둜 180도 νšŒμ „ μ‹œν‚¨ λ‹€μŒ, 
였λ₯Έμͺ½ N/2개의 μœ„에 λ†“μ•„μ•Ό ν•œλ‹€. μ΄ μž‘업은 λ‘ λ²ˆ λ°˜λ³΅ν•΄μ•Όν•œλ‹€. 
두 λ²ˆ λ°˜λ³΅ν•˜λ©΄ λ°”λ‹₯에 μžˆλŠ” μ–΄ν•­μ˜ μˆ˜λŠ” N/4κ°œκ°€ λœλ‹€. 
<κ·Έλ¦Ό 9>λŠ” μ΄ μž‘업을 1번 ν–ˆμ„ λ•Œ, <κ·Έλ¦Ό 10>은 λ‹€μ‹œ ν•œ λ²ˆ λ” ν–ˆμ„ λ•Œμ΄λ‹€.

μ—¬κΈ°μ„œ λ‹€μ‹œ μœ„μ—μ„œ ν•œ λ¬Όκ³ κΈ° μ‘°μ ˆ μž‘업을 μˆ˜ν–‰ν•˜κ³ , λ°”λ‹₯에 μΌλ ¬λ‘œ λ†“λŠ” μž‘업을 μˆ˜ν–‰ν•œλ‹€. <κ·Έλ¦Ό 10>μ—μ„œ μ‘°μ ˆ μž‘업을 λ§ˆμΉœ κ²°κ³ΌλŠ” <κ·Έλ¦Ό 11>이 λ˜κ³ , 
μ—¬κΈ°μ„œ λ‹€μ‹œ λ°”λ‹₯에 μΌλ ¬λ‘œ λ†“λŠ” μž‘업을 μˆ˜ν–‰ν•˜λ©΄ <κ·Έλ¦Ό 12>κ°€ λœλ‹€.

μ–΄ν•­μ˜ μˆ˜ N, κ° μ–΄ν•­μ— λ“€μ–΄μžˆλŠ” λ¬Όκ³ κΈ°μ˜ μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 
λ¬Όκ³ κΈ°κ°€ κ°€μž₯ λ§Žμ΄ λ“€μ–΄μžˆλŠ” μ–΄ν•­κ³Ό κ°€μž₯ μ κ²Œ λ“€μ–΄μžˆλŠ” μ–΄ν•­μ˜ λ¬Όκ³ κΈ° μˆ˜ μ°¨μ΄κ°€ K μ΄ν•˜κ°€ λ˜λ €λ©΄ μ–΄ν•­μ„ λͺ‡ λ²ˆ μ •λ¦¬ν•΄μ•Όν•˜λŠ”지 κ΅¬ν•΄λ³΄μž.

πŸ’š μž…λ ₯
첫째 μ€„에 N, Kκ°€ μ£Όμ–΄μ§„λ‹€. 
λ‘˜μ§Έμ—λŠ” μ–΄ν•­μ— λ“€μ–΄μžˆλŠ” λ¬Όκ³ κΈ°μ˜ μˆ˜κ°€ κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ–΄ν•­λΆ€ν„° μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€.

πŸ’™ μΆœλ ₯
λ¬Όκ³ κΈ°κ°€ κ°€μž₯ λ§Žμ΄ λ“€μ–΄μžˆλŠ” μ–΄ν•­κ³Ό κ°€μž₯ μ κ²Œ λ“€μ–΄μžˆλŠ” μ–΄ν•­μ˜ λ¬Όκ³ κΈ° μˆ˜ μ°¨μ΄κ°€ K μ΄ν•˜κ°€ λ˜λ €λ©΄ 
어항을 λͺ‡ λ²ˆ μ •λ¦¬ν•΄μ•Όν•˜λŠ”지 μΆœλ ₯ν•œλ‹€.
"""
[23291] μ–΄ν•­ 정리

πŸ’› 문제
λ§ˆλ²•μ‚¬ μƒμ–΄λŠ” κ·Έλ™μ•ˆ 배운 λ§ˆλ²•μ„ μ΄μš©ν•΄ 어항을 μ •λ¦¬ν•˜λ €κ³  ν•œλ‹€. 
어항은 μ •μœ‘λ©΄μ²΄ λͺ¨μ–‘이고, ν•œ λ³€μ˜ κΈΈμ΄λŠ” λͺ¨λ‘ 1이닀. 
상어가 가지고 μžˆλŠ” 어항은 N개이고, κ°€μž₯ μ²˜μŒμ— 어항은 일렬둜 λ°”λ‹₯ μœ„μ— 놓여져 μžˆλ‹€. 
μ–΄ν•­μ—λŠ” λ¬Όκ³ κΈ°κ°€ ν•œ 마리 이상 λ“€μ–΄μžˆλ‹€. 

<κ·Έλ¦Ό 1>은 μ–΄ν•­ 8κ°œκ°€ λ°”λ‹₯ μœ„μ— λ†“μ—¬μžˆλŠ” μƒνƒœμ΄λ©°, 
칸에 적힌 값은 κ·Έ 어항에 λ“€μ–΄μžˆλŠ” 물고기의 μˆ˜μ΄λ‹€. νŽΈμ˜μƒ 어항은 μ •μ‚¬κ°ν˜•μœΌλ‘œ ν‘œν˜„ν–ˆλ‹€.
=> 5, 2, 3, 14, 9, 2, 11, 8

어항을 ν•œ 번 μ •λ¦¬ν•˜λŠ” 과정은 λ‹€μŒκ³Ό 같이 이루어져 μžˆλ‹€.

λ¨Όμ €, 물고기의 μˆ˜κ°€ κ°€μž₯ 적은 어항에 λ¬Όκ³ κΈ°λ₯Ό ν•œ 마리 λ„£λŠ”λ‹€.
λ§Œμ•½, κ·ΈλŸ¬ν•œ 어항이 μ—¬λŸ¬κ°œλΌλ©΄ 물고기의 μˆ˜κ°€ μ΅œμ†ŒμΈ μ–΄ν•­ λͺ¨λ‘μ— ν•œ λ§ˆλ¦¬μ”© λ„£λŠ”λ‹€. 
μœ„μ˜ μ˜ˆμ‹œμ˜ 경우 물고기의 μˆ˜κ°€ κ°€μž₯ 적은 μ–΄ν•­μ—λŠ” λ¬Όκ³ κΈ°κ°€ 2마리 있고, κ·ΈλŸ¬ν•œ 어항은 2κ°œκ°€ μžˆλ‹€.
λ”°λΌμ„œ, 2개의 어항에 λ¬Όκ³ κΈ°λ₯Ό ν•œ λ§ˆλ¦¬μ”© λ„£μ–΄ <κ·Έλ¦Ό 2>와 같아진닀.
=> 5, 3, 3, 14, 9, 3, 11, 8

이제 어항을 μŒ“λŠ”λ‹€. λ¨Όμ €, κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” 어항을 κ·Έ μ–΄ν•­μ˜ 였λ₯Έμͺ½μ— μžˆλŠ” μ–΄ν•­μ˜ μœ„μ— 올렀 놓아 <κ·Έλ¦Ό 3>이 λœλ‹€.
=> 5, 
=> 3, 3, 14, 9, 3, 11, 8

이제, 2개 이상 μŒ“μ—¬μžˆλŠ” 어항을 λͺ¨λ‘ 곡쀑 λΆ€μ–‘μ‹œν‚¨ λ‹€μŒ, 전체λ₯Ό μ‹œκ³„λ°©ν–₯으둜 90도 νšŒμ „μ‹œν‚¨λ‹€. 
이후 곡쀑 λΆ€μ–‘μ‹œν‚¨ 어항을 λ°”λ‹₯에 μžˆλŠ” μ–΄ν•­μ˜ μœ„μ— μ˜¬λ €λ†“λŠ”λ‹€. 
=> 3, 5, 
=> 3, 14, 9, 3, 11, 8
λ°”λ‹₯의 κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ–΄ν•­ μœ„μ— 곡쀑 λΆ€μ–‘μ‹œν‚¨ μ–΄ν•­ 쀑 κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” 어항이 μžˆμ–΄μ•Ό ν•œλ‹€. 
이 μž‘μ—…μ€ 곡쀑 λΆ€μ–‘μ‹œν‚¨ μ–΄ν•­ 쀑 κ°€μž₯ 였λ₯Έμͺ½μ— μžˆλŠ” μ–΄ν•­μ˜ μ•„λž˜μ— λ°”λ‹₯에 μžˆλŠ” 어항이 μžˆμ„λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.
λ¨Όμ €, <κ·Έλ¦Ό 4>와 같이 어항이 놓인 μƒνƒœκ°€ λ³€ν•˜κ³ , ν•œ 번 더 λ³€ν•΄μ„œ <κ·Έλ¦Ό 5>κ°€ λœλ‹€.
=> 3, 3, 
=> 14, 5, 
=> 9, 3, 11, 8

<κ·Έλ¦Ό 5>μ—μ„œ ν•œ 번 더 어항을 곡쀑 λΆ€μ–‘μ‹œν‚€λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‹€. 
κ·Έ μ΄μœ λŠ” <κ·Έλ¦Ό 6>κ³Ό 같이 곡쀑 λΆ€μ–‘μ‹œν‚¨ μ–΄ν•­ 쀑 κ°€μž₯ 였λ₯Έμͺ½μ— μžˆλŠ” μ–΄ν•­μ˜ μ•„λž˜μ— λ°”λ‹₯에 μžˆλŠ” 어항이 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.
=> 9, 14, 3
=> 3, 5, 3
=> 11, 8

곡쀑 λΆ€μ–‘ μž‘μ—…μ΄ λͺ¨λ‘ λλ‚˜λ©΄, 어항에 μžˆλŠ” 물고기의 수λ₯Ό μ‘°μ ˆν•œλ‹€.
λͺ¨λ“  μΈμ ‘ν•œ 두 어항에 λŒ€ν•΄μ„œ, λ¬Όκ³ κΈ° 수의 차이λ₯Ό κ΅¬ν•œλ‹€. 
이 차이λ₯Ό 5둜 λ‚˜λˆˆ λͺ«μ„ d라고 ν•˜μž. dκ°€ 0보닀 크면, 두 μ–΄ν•­ 쀑 물고기의 μˆ˜κ°€ λ§Žμ€ 곳에 μžˆλŠ” λ¬Όκ³ κΈ° d 마리λ₯Ό 적은 곳에 μžˆλŠ” 곳으둜 보낸닀.
이 과정은 λͺ¨λ“  μΈμ ‘ν•œ 칸에 λŒ€ν•΄μ„œ λ™μ‹œμ— λ°œμƒν•œλ‹€. 이 과정이 μ™„λ£Œλ˜λ©΄ <κ·Έλ¦Ό 7>이 λœλ‹€.
=> 5, 3
=> 10, 6
=> 9, 5, 10, 8

이제 λ‹€μ‹œ 어항을 λ°”λ‹₯에 일렬둜 놓아야 ν•œλ‹€. κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ–΄ν•­λΆ€ν„°, 그리고 μ•„λž˜μ— μžˆλŠ” μ–΄ν•­λΆ€ν„° κ°€μž₯ μœ„μ— μžˆλŠ” μ–΄ν•­κΉŒμ§€ μˆœμ„œλŒ€λ‘œ λ°”λ‹₯에 놓아야 ν•œλ‹€. 
<κ·Έλ¦Ό 8>이 λ°”λ‹₯에 λ‹€μ‹œ 일렬둜 놓은 μƒνƒœμ΄λ‹€.
=> 9, 10, 5, 5, 6, 3, 10, 8

λ‹€μ‹œ 곡쀑 λΆ€μ–‘ μž‘μ—…μ„ ν•΄μ•Ό ν•œλ‹€. μ΄λ²ˆμ—λŠ” κ°€μš΄λ°λ₯Ό μ€‘μ‹¬μœΌλ‘œ μ™Όμͺ½ N/2개λ₯Ό 곡쀑 λΆ€μ–‘μ‹œμΌœ 전체λ₯Ό μ‹œκ³„ λ°©ν–₯으둜 180도 νšŒμ „ μ‹œν‚¨ λ‹€μŒ, 
였λ₯Έμͺ½ N/2개의 μœ„μ— 놓아야 ν•œλ‹€. 이 μž‘μ—…μ€ 두 번 λ°˜λ³΅ν•΄μ•Όν•œλ‹€. 
두 번 λ°˜λ³΅ν•˜λ©΄ λ°”λ‹₯에 μžˆλŠ” μ–΄ν•­μ˜ μˆ˜λŠ” N/4κ°œκ°€ λœλ‹€. 
<κ·Έλ¦Ό 9>λŠ” 이 μž‘μ—…μ„ 1번 ν–ˆμ„ λ•Œ, <κ·Έλ¦Ό 10>은 λ‹€μ‹œ ν•œ 번 더 ν–ˆμ„ λ•Œμ΄λ‹€.

μ—¬κΈ°μ„œ λ‹€μ‹œ μœ„μ—μ„œ ν•œ λ¬Όκ³ κΈ° 쑰절 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³ , λ°”λ‹₯에 일렬둜 λ†“λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. <κ·Έλ¦Ό 10>μ—μ„œ 쑰절 μž‘μ—…μ„ 마친 κ²°κ³ΌλŠ” <κ·Έλ¦Ό 11>이 되고, 
μ—¬κΈ°μ„œ λ‹€μ‹œ λ°”λ‹₯에 일렬둜 λ†“λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ <κ·Έλ¦Ό 12>κ°€ λœλ‹€.

μ–΄ν•­μ˜ 수 N, 각 어항에 λ“€μ–΄μžˆλŠ” 물고기의 μˆ˜κ°€ 주어진닀. 
λ¬Όκ³ κΈ°κ°€ κ°€μž₯ 많이 λ“€μ–΄μžˆλŠ” μ–΄ν•­κ³Ό κ°€μž₯ 적게 λ“€μ–΄μžˆλŠ” μ–΄ν•­μ˜ λ¬Όκ³ κΈ° 수 차이가 K μ΄ν•˜κ°€ 되렀면 어항을 λͺ‡ 번 μ •λ¦¬ν•΄μ•Όν•˜λŠ”μ§€ κ΅¬ν•΄λ³΄μž.

πŸ’š μž…λ ₯
첫째 쀄에 N, Kκ°€ 주어진닀. 
λ‘˜μ§Έμ—λŠ” 어항에 λ“€μ–΄μžˆλŠ” 물고기의 μˆ˜κ°€ κ°€μž₯ μ™Όμͺ½μ— μžˆλŠ” μ–΄ν•­λΆ€ν„° μˆœμ„œλŒ€λ‘œ 주어진닀.

πŸ’™ 좜λ ₯
λ¬Όκ³ κΈ°κ°€ κ°€μž₯ 많이 λ“€μ–΄μžˆλŠ” μ–΄ν•­κ³Ό κ°€μž₯ 적게 λ“€μ–΄μžˆλŠ” μ–΄ν•­μ˜ λ¬Όκ³ κΈ° 수 차이가 K μ΄ν•˜κ°€ 되렀면 
어항을 λͺ‡ 번 μ •λ¦¬ν•΄μ•Όν•˜λŠ”μ§€ 좜λ ₯ν•œλ‹€.
"""

from collections import deque
import sys

# μ–΄ν•­μ˜ 수 N, 각 어항에 λ“€μ–΄μžˆλŠ” 물고기의 수 K
n, k = map(int, sys.stdin.readline().split())
direction = [(-1, 0), (1, 0), (0, -1), (0, 1)]
board = list()

# [deque([5, 2, 3, 14, 9, 2, 11, 8])]
board.append(deque(list(map(int, sys.stdin.readline().split()))))

# λ¬Όκ³ κΈ°κ°€ κ°€μž₯ 적은 어항에 λ¬Όκ³ κΈ° ν•œ 마리 λ„£κΈ°
def push_fish(graph) :
    min_bowl_fish_num = min(graph[0])

    for i in range(len(graph[0])):
        if graph[0][i] == min_bowl_fish_num:
            # 물고기의 μˆ˜κ°€ κ°€μž₯ 적은 어항에 λ¬Όκ³ κΈ°λ₯Ό ν•œ 마리 λ„£λŠ”λ‹€
            graph[0][i] += 1

# κ°€μž₯ μ™Όμͺ½μ˜ 어항을 μœ„μ— μŒ“κΈ°
def popleft_stack(graph) :
    pop = graph[0].popleft()
    graph.append(deque([pop]))

# 곡쀑에 뜬 μ–΄ν•­λ“€ μ‹œκ³„λ°©ν–₯ 90도 νšŒμ „
def rotate_90_clock(bowls) :
    new_bowls = [[0] * len(bowls) for _ in range(len(bowls[0]))]

    for i in range(len(bowls[0])):
        for j in range(len(bowls)):
            new_bowls[i][j] = bowls[j][len(bowls[0])-1-i]

    return new_bowls
    
# 2개 이상 μŒ“μΈ μ–΄ν•­λ“€ λΆ„λ¦¬ν•΄μ„œ 곡쀑뢀양
def fly_bowls(graph) :
    while True :
        if len(graph) > len(graph[0]) - len(graph[-1]) :
            break

        will_fly = []
        will_fly_row = len(graph)
        will_fly_col = len(graph[-1])

        for i in range(will_fly_row) :
            new_deque = deque()

            for _ in range(will_fly_col) :
                new_deque.append(graph[i].popleft())

            will_fly.append(new_deque)

        graph = [graph[0]]

        rotated_bowls = rotate_90_clock(will_fly)
        for r in rotated_bowls :
            graph.append(deque(r))
    return graph

# μ–΄ν•­μ˜ λ¬Όκ³ κΈ° 수 쑰절
def fix_fish_num (graph) :
    dp = [[0] * len(graph[x]) for x in range(len(graph))]

    for x in range(len(graph)) :
        for y in range(len(graph[x])) :
            for d in direction :
                nx = x + d[0]
                ny = y + d[1]
                # λͺ¨λ“  μΈμ ‘ν•œ 두 어항에 λŒ€ν•΄μ„œ, λ¬Όκ³ κΈ° 수의 차이λ₯Ό κ΅¬ν•œλ‹€. 
                # 이 차이λ₯Ό 5둜 λ‚˜λˆˆ λͺ«μ„ d
                # dκ°€ 0보닀 크면, 두 μ–΄ν•­ 쀑 물고기의 μˆ˜κ°€ λ§Žμ€ 곳에 μžˆλŠ” λ¬Όκ³ κΈ° d 마리λ₯Ό 적은 곳에 μžˆλŠ” 곳으둜 보낸닀.
                # 이 과정은 λͺ¨λ“  μΈμ ‘ν•œ 칸에 λŒ€ν•΄μ„œ λ™μ‹œμ— λ°œμƒ
                if 0 <= nx < len(graph) and 0 <= ny < len(graph[nx]) :
                    # ν˜„μž¬ 칸이 더 크닀면
                    if graph[x][y] > graph[nx][ny]:
                        d = (graph[x][y] - graph[nx][ny]) // 5
                        if d >= 1:
                            dp[x][y] -= d
                    else:
                        d = (graph[nx][ny] - graph[x][y]) // 5
                        if d >= 1:
                            dp[x][y] += d

    for i in range(len(graph)):
        for j in range(len(graph[i])):
            graph[i][j] += dp[i][j]


# μ–΄ν•­ 일렬둜 놓기
def bowl_row (graph) :
    new_graph = deque()

    for i in range(len(graph[-1])):
        for j in range(len(graph)):
            new_graph.append(graph[j][i])

    for i in range(len(graph[-1]), len(graph[0])):
        new_graph.append(graph[0][i])

    result_list = list()
    result_list.append(new_graph)

    return result_list

# 180도 νšŒμ „
def rotate_180 (graph) :
    new_graph = []

    for i in reversed(range(len(graph))):
        graph[i].reverse()
        new_graph.append(graph[i])

    return new_graph


# λ‹€μ‹œ 곡쀑뢀양 (절반 자λ₯΄λŠ”데 2번 ν•˜κΈ°)
def fly_bowls2 (graph) :
    left1 = list()
    left2 = list()
    new_deque1 = deque()

    for i in range(n//2):
        new_deque1.append(graph[0].popleft())
    left1.append(new_deque1)

    rotated_left1 = rotate_180(left1)
    graph += rotated_left1

    for i in range(2):
        temp_deque = deque()
        for j in range(n//4):
            temp_deque.append(graph[i].popleft())
        left2.append(temp_deque)

    rotated_left2 = rotate_180(left2)
    graph += rotated_left2


# λ¬Όκ³ κΈ° κ°€μž₯ λ§Žμ€ μ–΄ν•­κ³Ό κ°€μž₯ 적은 μ–΄ν•­μ˜ 차이
def get_result(graph):
    dq = graph[0]
    result1 = max(dq) - min(dq)
    
    return result1

answer = 0
while True :
    result = get_result(board)

    if result <= k :
        print(answer)
        break

    push_fish(board)
    popleft_stack(board)
    board = fly_bowls(board)

    fix_fish_num(board)
    board = bowl_row(board)

    fly_bowls2(board)
    fix_fish_num(board)
    board = bowl_row(board)
    answer += 1

728x90
λ°˜μ‘ν˜•

'πŸ¦₯ μ½”ν…Œ > BAEKJOON' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BAEKJOON C++] 14501_퇴사  (0) 2023.08.19
[BAEKJOON C++] 13458_μ‹œν—˜ 감독  (0) 2023.08.19
[BAEKJOON C++] 10773_제둜  (0) 2023.08.17
[BAEKJOON C++] 5800_성적 톡계  (0) 2023.08.17
[BAEKJOON C++] 11655_ROT13  (0) 2023.08.17
Comments