๐Ÿงญ KAIST JUNGLE/Algorithm

[๋ฐฑ์ค€]1508 - ๋ ˆ์ด์Šค (#ํŒŒ์ด์ฌ #๊ทธ๋ฆฌ๋”” #์ด๋ถ„ํƒ์ƒ‰ #๊ฒฝ๊ณ„ ์„ค์ • ํ›„ ์นด์šดํŒ…)

seungineer = seungwoo + engineer 2024. 12. 18. 00:42

 

 

1508๋ฒˆ: ๋ ˆ์ด์Šค

 

boj.ma

๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์‹ฌํŒ ๊ฐ„ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ๋ฐฐ์น˜ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ตœ๋Œ€ํ•œ ๋“ฌ์„ฑ๋“ฌ์„ฑ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ตœ๋Œ€ํ•œ '๋“ฌ์„ฑ๋“ฌ์„ฑ' ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด '์‹ฌํŒ ๊ฐ„ ๊ฑฐ๋ฆฌ์— ๋Œ€ํ•ด ๊ทธ๋ฆฌ๋”” ์ „๋žต'์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ฌํŒ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ตœ๋Œ€ํ•œ ๋„“ํ˜€์„œ ๋ฐฐ์น˜ํ•ด ๋ณด๊ณ , ๋ฌธ์ œ ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด ์ขํ˜€์„œ ๋ฐฐ์น˜ํ•ด ๋ณด๊ณ , ๋˜๋‹ค์‹œ ๋„“ํ˜€ ๋ณด๊ณ , ... ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ •๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ๊ฒฝ๊ณ„(์‹ฌํŒ ๊ฐ„ ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ)๋ฅผ ์„ค์ •ํ•œ ํ›„์— ํ•ด๋‹น ๊ฒฝ๊ณ„์—์„œ ๋ช‡ ๋ช…์˜ ์‹ฌํŒ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฐฐ์น˜ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

์‹ฌํŒ ๋ฐฐ์น˜ ๋กœ์ง

์ถœ๋ ฅํ•  ๋•Œ๋Š” ์˜ˆ์ œ์™€ ๊ฐ™์ด ์‹ฌํŒ์„ ์„ธ์šธ ๊ณณ์—๋Š” 1์„, ์„ธ์šฐ์ง€ ์•Š์„ ๊ณณ์—๋Š” 0์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์ •๋‹ต์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์ „์ˆœ์œผ๋กœ ๊ฐ€์žฅ ๋Šฆ๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œ์˜ ์ถœ๋ ฅ ์กฐ๊ฑด์„ ์‚ดํŽด๋ณด๋ฉด '์‚ฌ์ „์ˆœ์œผ๋กœ ๊ฐ€์žฅ ๋Šฆ๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•œ๋‹ค'๋Š” ์กฐ๊ฑด์ด ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์‹ฌํŒ์˜ ์œ„์น˜๊ฐ€ ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ๋ฐฐ์น˜๋ฅผ ํ•˜๊ณ , ๋ฌธ์ œ์˜ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ฐฐ์น˜๊ฐ€ ์ •๋‹ต์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ€๋ น ์‹ฌํŒ์˜ ์œ„์น˜๊ฐ€ 0, 5, 10, 15์ด๊ณ , ๊ฒฝ๊ณ„(= ์ตœ๋Œ€ ๋–จ์–ด์ง„ ๊ฑฐ๋ฆฌ)๋ฅผ 5๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด '1110', '0111' ๋ฐฐ์น˜ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์ถœ๋ ฅ ์กฐ๊ฑด์—์„œ ์‚ฌ์ „์ˆœ์œผ๋กœ ๊ฐ€์žฅ ๋Šฆ๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ์กฐ๊ฑด์— ์˜ํ•ด '1110'์ด ์ •๋‹ต์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์‹ฌํŒ์˜ ์œ„์น˜๊ฐ€ ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ๋ฐฐ์น˜ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ž„์„ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ฌํŒ ๋ฐฐ์น˜ ์‹œ์ž‘์€ ์–ด๋””์„œ๋ถ€ํ„ฐ?

๋‚˜๋Š” ์‹ฌํŒ ๋ฐฐ์น˜์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋ชจ๋“  ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๋ชจ๋‘ ๊ฒ€์ฆํ•ด์ฃผ์—ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด K ๊ฐ’์ด ์ตœ๋Œ€ 50์œผ๋กœ ์ถฉ๋ถ„ํžˆ ์ž‘์•„ ๋ชจ๋“  ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๊ฒ€์ฆํ•˜๋”๋ผ๋„ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(2500) ์ˆ˜์ค€์œผ๋กœ ๋งค์šฐ ์ž‘๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, st ์ธ๋ฑ์Šค์—๋Š” ๋ฌด์กฐ๊ฑด ์‹ฌํŒ์ด ๋ฐฐ์น˜๋˜๊ณ , ํ•ด๋‹น ์ธ๋ฑ์Šค๋ณด๋‹ค ์œ„์น˜ ๊ฐ’์ด ํฐ ๊ณณ์—๋งŒ ์‹ฌํŒ์ด ๋ฐฐ์น˜๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

for st in range(K):
        # st ์ธ๋ฑ์Šค์—๋Š” ๋ฌด์กฐ๊ฑด ์‹ฌํŒ ๋ฐฐ์น˜
        order = ''
        cnt = 1
        for _ in range(st): order += '0'
        order += '1'
        prev = st
        
        for i in range(st + 1, K):
            if cnt == M:
                order += '0'
                continue
            if seq[i] - seq[prev] >= gap:
                prev = i
                order += '1'
                cnt += 1
            else:
                order += '0'

st ์ธ๋ฑ์Šค ์ „์—๋Š” ์‹ฌํŒ์ด ๋ฐฐ์น˜๋˜์ง€ ์•Š์œผ๋ฉฐ(= for _ in range(st): order += '0'), ํ•ด๋‹น ์œ„์น˜ ์ดํ›„๋ถ€ํ„ฐ ์ˆœํšŒํ•œ๋‹ค(= for i in range(st + 1, K):).

์‹ฌํŒ ๋ฐฐ์น˜์˜ ๋์€ ์–ธ์ œ?

์œ„ ์ฝ”๋“œ ๋ธ”๋Ÿญ์˜ cnt๊ฐ€ M์ด ๋˜๋ฉด ๋ฌด์กฐ๊ฑด order += '0' ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ์‹ฌํŒ ๋ฐฐ์น˜๊ฐ€ ๋๋‚œ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•˜์˜€๋‹ค. ์ฆ‰, ์‹ฌํŒ ๋ฐฐ์น˜ ๊ฐœ์ˆ˜์ธ cnt๊ฐ€ M์œผ๋กœ ๋ฌธ์ œ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๊ฒŒ ๋ฐฐ์น˜๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด ๋’ค์—๋Š” ๋” ์ด์ƒ ์‹ฌํŒ์„ ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ์ •๋‹ต์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ '์‚ฌ์ „์ˆœ์œผ๋กœ ๊ฐ€์žฅ ๋Šฆ์€ ๊ฒƒ์„ ์ถœ๋ ฅํ•œ๋‹ค'๋Š” ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. cnt๊ฐ€ M๊ฐœ ๋งŒํผ ๋ฐฐ์น˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ์ด๋ถ„ํƒ์ƒ‰์—์„œ ์กฐ๊ฑด ์กฐ์ •์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

์ด๋ถ„ ํƒ์ƒ‰์—์„œ ๊ฒฝ๊ณ„ ์กฐ์ •

l = 1
r = N
while l <= r:
    length = (l + r) // 2
    refCnt, refOrder = refreeCount(length)
    if refCnt > M:
        l = length + 1
    elif refCnt < M:
        r = length - 1
    else:
        ans = refOrder
        l = length + 1

print(ans)

์ดˆ๊ธฐ l๊ณผ r์€ ๊ฐ๊ฐ 1, N์œผ๋กœ ์„ค์ •๋œ๋‹ค. ์ด l, r์„ ํ†ตํ•ด ๊ฒฝ๊ณ„(length)๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ๊ฒฝ๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ฌํŒ ๋ฐฐ์น˜ ์ˆ˜, ์‹ฌํŒ ๋ฐฐ์น˜ ๊ฒฐ๊ณผ(refCnt, refOrder)๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค.

์‹ฌํŒ ๋ฐฐ์น˜ ์ˆ˜๊ฐ€ ๋ฌธ์ œ ์กฐ๊ฑด๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ๊ฒฝ๊ณ„๋ฅผ ๋Š˜๋ ค์„œ ์‹ฌํŒ ๋ฐฐ์น˜๊ฐ€ ๋” ์ ๊ฒŒ ๋˜๋„๋ก ์กฐ์ •ํ•œ๋‹ค. ์‹ฌํŒ ๋ฐฐ์น˜์ˆ˜๊ฐ€ ๋ฌธ์ œ ์กฐ๊ฑด๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ๊ฒฝ๊ณ„๋ฅผ ์ค„์—ฌ์„œ ์‹ฌํŒ ๋ฐฐ์น˜๊ฐ€ ๋” ๋งŽ๊ฒŒ ๋˜๋„๋ก ์กฐ์ •ํ•œ๋‹ค. ๋ฌธ์ œ ์กฐ๊ฑด๊ณผ ๋งž๊ฒŒ ์‹ฌํŒ์ด ๋ฐฐ์น˜๋œ ๊ฒฝ์šฐ ans ๊ฐ’์— ์‹ฌํŒ ๋ฐฐ์น˜ ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ๊ฒฝ๊ณ„๊ฐ€ ๋” ์ปค์กŒ์„ ๋•Œ๋„ ์ •๋‹ต์„ ์ฐพ์„ ์ˆ˜๋Š” ์—†์„์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์กฐ์ •(l = length + 1)ํ•œ๋‹ค.

์‹œ๊ฐ„ ๋ณต์žก๋„(Time Complexity)

์ด๋ถ„ ํƒ์ƒ‰์„ ํ†ตํ•ด ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(log(N))์ด๋‹ค. ์ด๋ถ„ ํƒ์ƒ‰ ๋‚ด์—์„œ ์‹ฌํŒ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณผ์ •์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ„์‚ฐํ•ด ๋ณด๋ฉด O(K^2)์ด๋‹ค. K๋Š” 50 ์ดํ•˜์ด๋ฏ€๋กœ O(K^2 * log(N))์€ ์ถฉ๋ถ„ํžˆ ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„ ๋ณต์žก๋„์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“ ์ฝ”๋“œ ์ „๋ฌธ