Skip to main content

Algorithm

BOJ 27421 Make a Loop

·622 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/27421 ๋ฒˆ์—ญ ๋ฌธ์ œ # Taro๋Š” ์žฅ๋‚œ๊ฐ ์ฒ ๋„ ์„ ๋กœ ์„ธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ ๋กœ๋Š” ์ง๊ฐ ์ค‘์‹ฌ๊ฐ(90๋„ ๊ฐ๋„)์„ ๊ฐ€์ง„ ํ˜ธ ๋ชจ์–‘์ด์ง€๋งŒ, ๋ฐ˜์ง€๋ฆ„์€ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. Taro๋Š” ์ด ๋ชจ๋“  ์„ ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์„ ๋กœ ์„ธํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฃจํ”„๋ฅผ ํ˜•์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ชจ๋“  ์„ ๋กœ์˜ ์–‘ ๋์ด ๋‹ค๋ฅธ ์„ ๋กœ์™€ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ๋˜๊ณ , ๋ชจ๋“  ์„ ๋กœ๊ฐ€ ์ง์ ‘ ๋˜๋Š” ๊ฐ„์ ‘์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ์„ ๋กœ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Taro๊ฐ€ ์ด๊ฒƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”.

BOJ 20929 ์ค‘๊ฐ„

·238 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/20929 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ฌธ์ œ์˜ ์ œํ•œ์ธ $2^{19}$์™€ ํšŸ์ˆ˜๋ฅผ ๋ณผ๋•Œ, ์ด๋ถ„ ํƒ์ƒ‰์„ ์žฅ๋ คํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ![[Drawing 2026-02-10 14.25.24.excalidraw.png]] ๊ธธ์ด 8์˜ ๋ฐฐ์—ด 2๊ฐœ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด $N/2$๋ฒˆ์งธ ์ˆ˜์ธ 4๋ฒˆ์งธ ์ˆ˜๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์œ„์™€ ๊ฐ™์ด ์ž‘์€ ๋ฐฐ์—ด์˜ ์•„๋ž˜ ์ ˆ๋ฐ˜๊ณผ ํฐ ๋ฐฐ์—ด์˜ ์œ—์ชฝ ์ ˆ๋ฐ˜์€ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค. ![[Drawing 2026-02-10 14.31.00.excalidraw.png]] ์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์œ„์—์„œ ์ž‘์€ ๋ฐฐ์—ด ์ชฝ 4๊ฐœ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ณด๋ฉด $N$์ด ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“  ์ƒํ™ฉ์—์„œ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์„ 1๊ฐœ๊ฐ€ ๋‚จ์„๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด ๋‘ ๊ฐ’์€ ๊ฐ๊ฐ $N, N+1$๋ฒˆ์งธ ๊ฐ’์ผ ๊ฒƒ์ด๋‹ค. ๋ฌธ์ œ์—์„œ๋Š” $N$๋ฒˆ์งธ ์ˆ˜๋ฅผ ์š”๊ตฌํ–ˆ์œผ๋ฏ€๋กœ, ๋” ์ž‘์€ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (python): def Query(s, idx): """ ์งˆ๋ฌธ "? s idx"์„ ํ•˜๊ณ  ์ž…๋ ฅ๋ฐ›๋Š” ํ•จ์ˆ˜ """ print("?", s, idx) return int(input()) N = int(input()) A_Lidx = 1 A_Ridx = N # [A_Lidx ~ A_Ridx] ์— ์ •๋‹ต ํ›„๋ณด๊ฐ€ ์žˆ์Œ B_Lidx = 1 B_Ridx = N # [B_Lidx ~ B_Ridx] ์— ์ •๋‹ต ํ›„๋ณด๊ฐ€ ์žˆ์Œ while A_Ridx > A_Lidx: A_mid = (A_Lidx + A_Ridx) // 2 B_mid = (B_Lidx + B_Ridx) // 2 A_ret = Query("A", A_mid) B_ret = Query("B", B_mid) if A_ret <= B_ret: A_Lidx = A_mid + 1 B_Ridx = B_mid else: A_Ridx = A_mid B_Lidx = B_mid + 1 A_ret = Query("A", A_Lidx) B_ret = Query("B", B_Lidx) print("!", min(A_ret, B_ret)) ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 18214 Reordering the Documents

·719 words·4 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/18214 ๋ฒˆ์—ญ ๋ฌธ์ œ ๋ฒˆ์—ญ # Susan์€ ์‹ํƒ ์ •๋ฆฌ๋Š” ์ž˜ํ•˜์ง€๋งŒ, ์‚ฌ๋ฌด์‹ค ์ฑ…์ƒ ์ •๋ฆฌ๋Š” ์ž˜ ๋ชปํ•ฉ๋‹ˆ๋‹ค. Susan์€ ๋ฐฉ๊ธˆ ์ผ๋ จ์˜ ๋ฌธ์„œ๋“ค์— ๋Œ€ํ•œ ์„œ๋ฅ˜ ์ž‘์—…์„ ๋งˆ์ณค๊ณ , ๋ฌธ์„œ๋“ค์€ ์—ฌ์ „ํžˆ ์ฑ…์ƒ์— ์Œ“์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ๋“ค์€ ์ผ๋ จ๋ฒˆํ˜ธ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ƒ์‚ฌ๊ฐ€ ๊ฐ€์ ธ์™”์„ ๋•Œ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์Œ“์—ฌ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ์€ ์ˆœ์„œ๊ฐ€ ์™„๋ฒฝํ•˜์ง€ ์•Š์€๋ฐ, Susan์ด ๋„ˆ๋ฌด ๊ฒŒ์„๋Ÿฌ์„œ ๋”๋ฏธ์—์„œ ๋น ์ ธ๋‚˜์˜จ ๋ฌธ์„œ๋“ค์„ ์ œ์ž๋ฆฌ์— ๋‹ค์‹œ ๋„ฃ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์ด ๋๋‚ฌ๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๊ณ , ์ƒ์‚ฌ๋Š” ๊ทธ๋…€์—๊ฒŒ ๋ณด๋‚ด๊ณ  ์žˆ๋Š” ๋ฌธ์„œ ์ƒ์ž์— ๋ฌธ์„œ๋“ค์„ ์ฆ‰์‹œ ๋ฐ˜๋‚ฉํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ฌธ์„œ๋“ค์€ ์ผ๋ จ๋ฒˆํ˜ธ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์ž์— ๋ณด๊ด€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

BOJ 1300 K๋ฒˆ์งธ ์ˆ˜

·151 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1300 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ๊ณ„์‚ฐํ•œ๋‹ค๋ฉด, ์ •์ˆ˜๊ฐ€ $10^{10}$๊ฐœ ์žˆ์œผ๋‹ˆ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ๋œ๋‹ค. ์‹ฌ์ง€์–ด ์ €์žฅ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์–ด๋–ค ์ˆ˜ $X$๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, $X$๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜๊ฐ€ ๋ช‡๊ฐœ์ธ์ง€๋Š” $O(N)$์— ์…€ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  $X$๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ˆ˜๊ฐ€ $K$๊ฐœ ์ด์ƒ์ธ ์ˆ˜์ค‘ ๊ฐ€์žฅ ์ž‘์€ $X$๊ฐ€ ์ •๋‹ต์ด๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜๋ฅผ ์ด์šฉํ•ด $O(N\log{10^9})$์ •๋„์— ๊ณ„์‚ฐํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (python): N = int(input()) K = int(input()) def count(X): # ๋ฐฐ์—ด์—์„œ X ์ดํ•˜ ์ˆ˜์˜ ๊ฐœ์ˆ˜ result = 0 for i in range(1, N+1): result += min(N, X // i) return result ok = N*N ng = 0 # ๋‹ต์˜ ๋ฒ”์œ„๋Š” [1, N*N]์ด๋ฏ€๋กœ while ok - ng > 1: mid = (ok + ng) // 2 if count(mid) >= K: ok = mid else: ng = mid print(ok) ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 31760 Joys of Trading

·724 words·4 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/31760 ๋ฒˆ์—ญ ๋ฌธ์ œ # Apolyanka์™€ Bรผdelsdorf๋Š” ์ตœ๊ทผ ์ ‘์ด‰ํ•˜๊ฒŒ ๋œ ๋‘ ๊ฐœ์˜ ์ž‘์€ ์‹ ์„๊ธฐ ์‹œ๋Œ€ ๋งˆ์„์ž…๋‹ˆ๋‹ค. $1$๋ถ€ํ„ฐ $N$๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„ $N$๊ฐœ์˜ ์ž์›์ด ์žˆ์œผ๋ฉฐ, ๊ฐ ๋งˆ์„์€ ์„œ๋กœ ๋‹ค๋ฅธ ํšจ์œจ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์ด๋“ค ์ž์›์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์› $i$๋ฅผ ํ•œ ๋‹จ์œ„ ์ƒ์‚ฐํ•˜๊ธฐ ์œ„ํ•ด, Apolyanka๋Š” $A_i$ ์ธ์‹œ(person-hours)๊ฐ€ ํ•„์š”ํ•˜๊ณ , Bรผdelsdorf๋Š” $B_i$ ์ธ์‹œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ Apolyanka๋Š” ์ฃผ์–ด์ง„ ๊ฐ ์‹œ๊ฐ„ ๊ธฐ๊ฐ„์— ์ž์› $i$๋ฅผ $U_i$ ๋‹จ์œ„ ์ƒ์‚ฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, Bรผdelsdorf๋Š” $W_i$ ๋‹จ์œ„๋ฅผ ์ƒ์‚ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

BOJ 26969 Bribing Friends

·493 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/26969 ๋ฒˆ์—ญ ๋ฌธ์ œ ๋ฒˆ์—ญ # Bessie๋Š” “์†Œ ์œ ์ „์ฒดํ•™: ๋‹คํ๋ฉ˜ํ„ฐ๋ฆฌ"๋ฅผ ๋ณด๊ณ  ์‹ถ์ง€๋งŒ, ํ˜ผ์ž ๊ฐ€๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„, ๊ทธ๋…€์˜ ์นœ๊ตฌ๋“ค์€ ํ•จ๊ป˜ ๊ฐˆ ๋งŒํผ ์—ด์ •์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๋”ฐ๋ผ์„œ Bessie๋Š” ์นœ๊ตฌ๋“ค์ด ์˜ํ™”๊ด€์— ํ•จ๊ป˜ ๊ฐ€๋„๋ก ๋‡Œ๋ฌผ์„ ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋…€๋Š” ๋‘ ๊ฐ€์ง€ ๋‡Œ๋ฌผ ์ˆ˜๋‹จ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: ๋ฌด๋‹ˆ(mooney)์™€ ์•„์ด์Šคํฌ๋ฆผ ์ฝ˜์ž…๋‹ˆ๋‹ค.

BOJ 26857 Cell Game

·858 words·5 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/26857 ๋ฒˆ์—ญ ๋ฌธ์ œ ๋ฒˆ์—ญ # ๋‘ ํ˜•์ œ Aldo์™€ Bondan์€ COVID-19 ํŒฌ๋ฐ๋ฏน ์ƒํ™ฉ์ด ์•…ํ™”๋˜์–ด ๋„์‹œ๊ฐ€ ๋‹ค์‹œ ๋ด‰์‡„๋˜๋ฉด์„œ ์ง‘์— ๊ฐ‡ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํ•™๊ธฐ๋ฅผ ๋งˆ์น˜๊ณ  ๋ฐฉํ•™ ์ค‘์ด์ง€๋งŒ, ์ง‘ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด ๋ฌด์Šจ ๋ฐฉํ•™์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ์„๊นŒ์š”? ํ•˜์ง€๋งŒ ์ง€๋ฃจํ•จ์€ ์ฐฝ์˜์„ฑ์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ง€๋ฃจํ•œ ๋ฐฉํ•™ ๋™์•ˆ ์ƒˆ๋กœ์šด ๊ฒŒ์ž„์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

BOJ 13448 SW ์—ญ๋Ÿ‰ ํ…Œ์ŠคํŠธ

·233 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/13448 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์–ป๋Š” ์ ์ˆ˜๊ฐ€ $M_i - t * p_i$๊ฐ€ ์•„๋‹Œ $M_i$๋ผ๋ฉด, ๋‹จ์ˆœํ•œ ๋ฐฐ๋‚ญ๋ฌธ์ œ์ผํ…๋ฐ.. ์ด๊ฑธ ์œ„ํ•ด์„œ $N$์— ๋Œ€ํ•œ ๋น„ํŠธ๋งˆ์Šคํ‚น์„ ์ถ”๊ฐ€ํ•˜๋Š”๊ฑด ๋ฏธ์นœ์ง“์ด๋‹ค ๊ทธ๋Ÿฐ๋ฐ, ์–ด๋–ค ๋ฌธ์ œ๋“ค์„ ํ’€๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด, ๊ทธ ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด ์ˆœ์„œ๋ฅผ ์ •ํ•˜๋Š”๊ฑด ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ๋˜์ง€ ์•Š๋‚˜? ๋ฌธ์ œ $i, j$๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. $i \rightarrow j$๋กœ ํ’€๋ฉด $(M_i - t * P_i) + (M_j - (t + R_i)*P_j)$ ์ ์„ ์–ป๊ฒŒ ๋˜๊ณ  $j -> i$๋กœ ํ’€๋ฉด $(M_j - t*P_j) + (M_i - (t + R_j) * P_i)$ ์ ์„ ์–ป๊ฒŒ ๋œ๋‹ค. ์œ„์—์„œ ์•„๋ž˜ ์‹์„ ๋นผ๋ฉด $P_i * R_j - P_j * R_i$ ์ด๊ณ , $i \rightarrow j$๊ฐ€ ์ด๋“์ด๊ธฐ ์œ„ํ•ด์„  ์ด๊ฒŒ ์–‘์ˆ˜์—ฌ์•ผํ•˜๋ฏ€๋กœ $\frac{P_i}{R_i} \geq \frac{P_j}{R_j}$๋กœ ์ •๋ ฌํ•˜๋Š” ๊ทธ๋ฆฌ๋”” ์ „๋žต์ด ์œ ํšจํ•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ˆœ์„œ๋กœ ๋ƒ…์ƒ‰ DP๋ฅผ ์ˆ˜ํ–‰ํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, T; cin >> N >> T; vector<Problem> Prob(N); rep(i, 0, N) cin >> Prob[i].M; rep(i, 0, N) cin >> Prob[i].P; rep(i, 0, N) cin >> Prob[i].R; sort(all(Prob), [](Problem &A, Problem &B){ return A.P * B.R > B.P * A.R; }); vector<ll> DP(T+1); for(auto [M, P, R]: Prob) rrep(t, 0, T+1){ if(t - R < 0) break; DP[t] = max(DP[t], DP[t - R] + (M - P*t)); } ll ans = 0; rep(i, 0, T+1) ans = max(ans, DP[i]); cout << ans; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 31265 ํ›ˆ๋ จ

·186 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/31265 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ดํ•ด๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ค์šด๋ฐ, ๊ฒฐ๊ตญ $N$๊ฐœ์˜ ํ›ˆ๋ จ ์ƒํ™ฉ์—์„œ $d$๊ฐœ์˜ ํ›ˆ๋ จ ๊ฐ€์šด๋ฐ ํ•˜๋‚˜๋ฅผ ๊ณ„์† ๊ณ ๋ฅด๊ณ , ํ›ˆ๋ จ ์‹œ๊ฐ„์˜ ํ•ฉ์„ ์ตœ๋Œ€ํ™” ํ•˜๊ณ ์‹ถ๋‹ค. ๋ฐฐ๋‚ญ ๋ฌธ์ œ์™€ ๋น„์Šทํ•ด๋ณด์ธ๋‹ค. $d$๊ฐœ์˜ ์„ ํƒ์ง€๊ฐ€ $N$๋ฒˆ ์ฃผ์–ด์ง€๊ณ , ํ›ˆ๋ จ์‹œ๊ฐ„ = ๋ฌด๊ฒŒ์˜ ํ•ฉ์„ ์ตœ๋Œ€ํ™” ํ•ด์•ผํ•œ๋‹ค. ์–ด? ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ํ•˜๋ฉด ํ„ฐ์ง€๋‚˜? ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ํ•ด์•ผํ•˜๋Š” ์—ฐ์‚ฐ๋Ÿ‰์€ $M * d_i$์ด๋‹ค. ์ด ์—ฐ์‚ฐ๋Ÿ‰์€ $\sum\limits_{i = 1}^N M * d_i \leq 1000 M$ ์ด๋‹ˆ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์•„๋‹ˆ!!!!!!!! ์™œํ‹€๋ ธ๋‚˜ ํ–ˆ๋„ค ๊ฐ ํ›ˆ๋ จ ์ƒํ™ฉ์—์„œ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํ›ˆ๋ จ์„ ๊ณจ๋ผ ํ›ˆ๋ จ ๊ณ„ํš์— ๋„ฃ์œผ๋ ค๊ณ  ํ•œ๋‹ค. ํ•œ ํ›ˆ๋ จ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์“ฐ์ง€ ์•Š๊ฒŒ $M$์— ๋Œ€ํ•ด ์—ญ์ˆœ์œผ๋กœ ๋Œ๋ฉด์„œ, ์ž˜ ์ฒ˜๋ฆฌํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ cin >> N >> M; rep(i, 0, N){ cin >> D[i]; tv[i].resize(D[i]); } rep(i, 0, N) rep(j, 0, D[i]) cin >> tv[i][j]; knapsack[0][0] = true; rep(i, 1, N+1) for(auto t: tv[i-1]) rrep(j, 0, M+1) if(j - t >= 0 && (knapsack[i-1][j-t] || knapsack[i][j-t])) knapsack[i][j] = true; rrep(j, 0, M+1) if(knapsack[N][j]){ cout << j; return; } cout << -1; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 30788 Sakura Reflection

·335 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30788 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋Œ€์นญ์ด๋™์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ•™์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?? ์‰ฌ์šด๊ฑฐ๋ถ€ํ„ฐ ํ•ด๋ณด์ž. ์›๋ž˜ ์ ์ด $(x, y)$์— ์žˆ์—ˆ๋‹ค๋ฉด $90\degree$ ์ง์„ ์— ๋Œ€์นญ์‹œํ‚ค๋ฉด $(-x, y)$ $45\degree$ ์ง์„ ์— ๋Œ€์นญ์‹œํ‚ค๋ฉด $(y, x)$ $60\degree$ ์ง์„ ์— ๋Œ€์นญ์‹œํ‚ค๋ฉด $y = \sqrt{3}x$์— ๋Œ€์นญ์ธ๊ฑฐ๋‹ˆ๊นŒ… ์•„๋‹ˆ ์ด๊ฑฐ ๋„ˆ๋ฌด ๊นŒ๋‹ค๋กœ์šด๋ฐ? ํ–‰๋ ฌ์—ฐ์‚ฐ์€ ํ•˜๊ธฐ ์‹ซ์€๋ฐ.. ๊ฐ๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด๋Š”๊ฒƒ๋„ ์ข‹๊ฒ ๋‹ค. ๊ทน์ขŒํ‘œ๊ณ„์ฒ˜๋Ÿผ, ์›๋ž˜ ์ ์ด $0\degree$์— ์žˆ์—ˆ๋‹ค๋ฉด $60\degree$์— ๋Œ€ํ•ด ๋Œ€์นญ์‹œํ‚ค๋ฉด $120\degree$์— $120\degree$์— ๋Œ€ํ•ด ๋Œ€์นญ์‹œํ‚ค๋ฉด $240\degree$์— ์ด๋Ÿฐ ๋А๋‚Œ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์˜ˆ์ œ 1๋ฒˆ์€ $0\degree \rightarrow 120\degree \rightarrow 330 \degree \rightarrow 60 \degree \rightarrow 0$ ์ธ๊ฑฐ ๊ฐ™๋‹ค! $45\degree = 225\degree$๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๊ฐ€๊นŒ์šด ๊ณณ์„ ์ฐพ์•„์„œ ๋‘๋ฐฐ๋กœ ๋„˜๊ธฐ๊ณ , 360์œผ๋กœ ๋ชจ๋“ˆ๋Ÿฌ๋ฅผ ์ทจํ•˜์ž. ์ž, ์ด์ œ ํ•œ๋ฒˆ์”ฉ ์จ์„œ 0๋„๋กœ ๋Œ์•„์˜ค๋Š”๊ฑธ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์ง€? $15\degree$๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๊ฑด $30\degree$ $x\degree$๋ฅผ $a$์— ๋Œ€์นญ์ด๋™์‹œํ‚ค๋ฉด $(2a - x) \degree$๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค! ์ด๊ฑธ ๋˜ $b$์— ๋Œ€์นญ์ด๋™์‹œํ‚ค๋ฉด $(2b - (2a - x))\degree$ ์ธ๊ฑฐ๊ฐ™๊ณ .. ๊ทธ๋Ÿฌ๋ฉด ํ”Œ๋งˆ๋กœ ๋ฐ”๋€Œ์–ด๊ฐ€๋ฉด์„œ ๋”ํ•ด์ง€๋‹ˆ๊นŒ ๊ฒฐ๊ตญ ๋ชจ๋“ˆ๋Ÿฌ 360์— ๋Œ€ํ•ด ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆˆ ํ•ฉ์„ ์ผ์ •ํ•˜๊ฒŒ ๋งž์ถœ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฌธ์ œ๋กœ ๋ฐ”๋€๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; vector<int> A(N); rep(i, 0, N) cin >> A[i]; if(N%2){ cout << "NO"; return; } int sum = 0; for(auto x: A) sum += x; sum %= 360; DP[0][0][0] = true; rep(i, 0, N) rrep(j, 0, N) rep(k, 0, 360) if(DP[i][j][k]){ int nxt = (k + A[i]*2) % 360; DP[i+1][j+1][nxt] = true; DP[i+1][j][k] = true; } if(DP[N][N/2][sum] || DP[N][N/2][(sum + 180) % 360]){ cout << "YES\n"; vector<bool> used(N); int ci = N, cj = N/2, cs = sum; if(!DP[N][N/2][sum]) cs = (sum + 180) % 360; while(cj){ int prv = (cs - A[ci-1]*2) % 360; if(prv < 0) prv += 360; if(DP[ci-1][cj - 1][prv]){ used[ci-1] = true; ci--; cj--; cs = prv; } else ci--; } vector<int> v1, v2; rep(i, 0, N){ if(used[i]) v1.push_back(i+1); else v2.push_back(i+1); } rep(i, 0, N/2){ cout << v1[i] << ' ' << v2[i] << ' '; } } else cout << "NO"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ