๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/Algorithm

[๋ฐฑ์ค€]2141 - ์šฐ์ฒด๊ตญ (#ํŒŒ์ด์ฌ #๋ฒกํ„ฐ์˜ ๋‚ด๋ถ„, ์™ธ๋ถ„)

seungineer = seungwoo + engineer 2024. 12. 10. 22:39

 

 

2141๋ฒˆ: ์šฐ์ฒด๊ตญ

 

boj.ma

๋ฌธ์ œ์˜ ์กฐ๊ฑด

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” X[1], A[1], X[2], A[2], …, X[N], A[N]์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฒ”์œ„๋Š” |X[i]| ≤ 1,000,000,000, 1 ≤ A[i] ≤ 1,000,000,000 ์ด๋ฉฐ ๋ชจ๋“  ์ž…๋ ฅ์€ ์ •์ˆ˜์ด๋‹ค.

N์ด 10^5์œผ๋กœ O(N^2) ์ดํ•˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ O(N^2) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ชจ๋“  N์— ๋Œ€ํ•ด ์šฐ์ฒด๊ตญ์„ ์„ธ์›Œ์„œ ํ•ด๋‹น ์šฐ์ฒด๊ตญ์—์„œ ๋งˆ์„๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด ์‰ฝ๊ฒŒ '๊ฑฐ๋ฆฌ์˜ ํ•ฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ์œ„์น˜'๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌธ์ œ ์ ‘๊ทผ

์ž„์˜์˜ ์šฐ์ฒด๊ตญ ์œ„์น˜๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ์‹์„ ์„ธ์›Œ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๋งˆ์„์€ (1, 0), (2, 0), (3, 0)์— ์œ„์น˜ํ•˜๊ณ , ์šฐ์ฒด๊ตญ์€(k, 0)์— ์œ„์น˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค(์‹ค์ œ๋กœ๋Š” ๋ฌธ์ œ ์กฐ๊ฑด์—์„œ ์ˆ˜์ง์„ ์ด๋ผ๊ณ  ๋ช…์‹œํ–ˆ๊ธฐ์— y์ถ•์— ๋Œ€ํ•œ ๊ณ ๋ ค๋Š” ํ•„์š” ์—†์œผ๋‚˜ ์„ค๋ช…์˜ ํŽธ์˜์ƒ y์ถ•์„ ๋„์ž…ํ•จ). ์šฐ์ฒด๊ตญ์ด (k, 0)์— ์œ„์น˜ํ•  ๋•Œ ๊ฐ ๋งˆ์„๊นŒ์ง€ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Latex: $ f(k) = โ˜k - 1โ˜ * 3 + โ˜k - 2โ˜*5 + โ˜k - 3โ˜*3 $

์šฐ์ฒด๊ตญ์˜ ์œ„์น˜(k์˜ ๊ฐ’)์— ๋”ฐ๋ผ ์ ˆ๋Œ“๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ํ•ด์„๋˜๋ฉฐ ์‹์ด ๋ณ€๋™ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์œ„ ์‹์—์„œ 1, 2, 3์€ ๊ฐ๊ฐ ๋งˆ์„์˜ ์œ„์น˜์ด๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” k ๊ฐ’์„ ๋ณ€๋™ํ•ด๊ฐ€๋ฉฐ ํ•ด๋‹น ์‹์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ด ์‹์˜ ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•œ ํ›„์— ์กฐ๊ธˆ ๋” ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ์‹์„ ํ’€์–ด์จ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

k๋กœ ๋‚˜ํƒ€๋‚ธ ์‹์ด ๋ฒกํ„ฐ์˜ ๋‚ด์ , ์™ธ์ ์‹๊ณผ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, x1, x2, x3, x4์˜ ๊ฐ’์— ๋ฌด๊ด€ํ•˜๊ฒŒ a, b, c, d๋ผ๋Š” ๊ณ„์ˆ˜์˜ ์˜ํ–ฅ๋งŒ์„ ๋ฐ›์œผ๋ฉฐ k๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค!

 

a, b, c, d๋Š” ์–ด๋–ป๊ฒŒ k ๊ฐ’์— ์˜ํ–ฅ์„ ์ค„๊นŒ? 

  • a + b - c - d > 0 ์ด๋ฉด, ๋‚ด๋ถ€์— ๋ฌด๊ฒŒ ์ค‘์‹ฌ์ด ์กด์žฌํ•˜๋Š” ๋‚ด๋ถ„
  • a + b - c - d < 0 ์ด๋ฉด, ์™ธ๋ถ€์— ๋ฌด๊ฒŒ ์ค‘์‹ฌ์ด ์กด์žฌํ•˜๋Š” ์™ธ๋ถ„

์œ„ ์‚ฌ์‹ค์— ๋”ฐ๋ผ a + b ๋ถ€๋ถ„ (์—ฌ๊ธฐ์„œ๋Š” (a + b)์ด์ง€๋งŒ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ์ƒ๊ฐํ•˜๋ฉด k๋ณด๋‹ค ์ž‘์€ x์˜ ๊ณ„์ˆ˜๋“ค์˜ ํ•ฉ์ด๋‹ค.)์ด c + d ๋ณด๋‹ค ํฌ๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„์˜ k ๊ฐ’์ด ์ •๋‹ต์ด ๋จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ

์œ„ ์‚ฌ์‹ค์— ๋”ฐ๋ผ 'k๋ณด๋‹ค ์ž‘์€ x์˜ ๊ณ„์ˆ˜์˜ ํ•ฉ'์„ ๊ตฌํ•˜๋ฉด์„œ ํ•ด๋‹น ๊ฐ’์ด ๋‚˜๋จธ์ง€ ๊ณ„์ˆ˜์˜ ํ•ฉ(์œ„ ์‹์—์„œ c + d์— ํ•ด๋‹น)๋ณด๋‹ค ์ปค์ง€๋Š” ๋ฐ”๋กœ ๊ทธ ์‹œ์ ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ์ง€์ ์ด ๋‚ด๋ถ„์ด ๋˜๋Š” ๊ฐ€์žฅ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ์ง€์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

peoples.sort()

acc_cnt = 0
for i in range(N):
    village, people = peoples[i]
    acc_cnt += people
    if acc_cnt >= tot_people / 2:
        print(village)
        break

์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๋‹ค.  acc_cnt๊ฐ€ k ๋ณด๋‹ค ์ž‘์€ x์˜ ๊ณ„์ˆ˜์˜ ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  tot_people / 2๋Š” ๋‚˜๋จธ์ง€ ๊ณ„์ˆ˜์˜ ํ•ฉ์˜ ์—ญํ• ์„ ํ•œ๋‹ค. ์ฆ‰, ๋‚˜๋จธ์ง€ ๊ณ„์ˆ˜์˜ ํ•ฉ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ๋งˆ์„์„ ์ถœ๋ ฅํ•˜๋ฉด ์ •๋‹ต์ธ ๊ฒƒ์ด๋‹ค.


์ฝ”๋“œ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ๋ฐ ๋…ผ๋ฆฌ๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๋‹ค. ํŠนํžˆ x1, x2, x3, ... xi(=์šฐ์ฒด๊ตญ๊ณผ ๋งˆ์„ ๊ฐ„ ๊ฑฐ๋ฆฌ)์— ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณ„์ˆ˜(=๋งˆ์„ ์‚ฌ๋žŒ ์ˆ˜)๋งŒ ์˜ํ–ฅ์„ ์ค€๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๋‹ค. ์œ„ ์‚ฌํ•ญ์„ ๋ฒกํ„ฐ์˜ ๋‚ด๋ถ„, ์™ธ๋ถ„์œผ๋กœ ์ดํ•ดํ•œ ํ›„์—๋Š” ์‰ฝ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.