๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
โ๏ธIdea Sketch
๋ฌธ์ ์์ฝ
๋ฌผ๋ณ์ด N๊ฐ ์๋๋ฐ 1๋ฆฌํฐ์ฉ ๋ค์ด์๋ค. ๋ฌผ์ด ๋ ๋ฌผ๋ณ์ K๊ฐ ์ดํ๋ก ๋ง๋ค์ด๋ณด์.
๋จ, ์ฌ๋ถ๋ฐฐ ๊ท์น์ ์๋์ ๊ฐ๋ค.
๋จผ์ ๊ฐ์ ์์ ๋ฌผ์ด ๋ค์ด์๋ ๋ฌผ๋ณ ๋ ๊ฐ๋ฅผ ๊ณ ๋ฅธ๋ค. ๊ทธ ๋ค์์ ํ ๊ฐ์ ๋ฌผ๋ณ์ ๋ค๋ฅธ ํ ์ชฝ์ ์๋ ๋ฌผ์ ๋ชจ๋ ๋ถ๋๋ค. ๋ฌผ์ด ๋ ๋ฌผ๋ณ์ด K๊ฐ ์ดํ๊ฐ ๋๋ฉด ์ข
๋ฃํ๋ค.
๋์ด์ ๋ฌผ๋ณ ๋ ๊ฐ๋ฅผ ๊ณ ๋ฅผ ์ ์์ผ๋ฉด, ์์ ์์ ๋ฌผ๋ณ์ ์ด ์ ์๋ค. ๋ฌผ์ 1๋ฆฌํฐ ๋ค์ด์๋ค.
๋ชฉํ : ์์ ์์ ์ฌ์ผํ๋ ๋ฌผ๋ณ์ ์ต์๊ฐ์ ์ถ๋ ฅํ์.
์์
N=3์ด๊ณ , K=1์ธ ๊ฒฝ์ฐ๋ฅผ ์๋ก ๋ค์ด๋ณด์. ํ ๋ณ์ ๋๋ค๋ฅธ ๋ณ์ ๋ถ์ผ๋ฉด, 2๋ฆฌํฐ ๋ฌผ๋ณ ํ๋์, 1๋ฆฌํฐ ๋ฌผ๋ณ ํ๋๊ฐ ๋จ๋๋ค. ๋ง์ฝ ์์ ์์ 1๋ฆฌํฐ ๋ฌผ๋ณ ํ๋๋ฅผ ์ฌ๋ฉด, 2๋ฆฌํฐ ๋ฌผ๋ณ ๋ ๊ฐ๋ฅผ ๋ง๋ค ์ ์๋ค. ๋ง์ง๋ง์ผ๋ก 4๋ฆฌํฐ๊ฐ ๋ค์ด์๋ ๋ฌผ๋ณ ํ ๊ฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
์์ ์
๋ ฅ 1
3 1
์์ ์ถ๋ ฅ 1
1
์์ ์
๋ ฅ 2
13 2
์์ ์ถ๋ ฅ 2
3
์์ ์
๋ ฅ 3
1000000 5
์์ ์ถ๋ ฅ 3
15808
์๊ณ ๋ฆฌ์ฆ : ๊ทธ๋ฆฌ๋, ๋นํธ๋ง์คํน
๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ทธ๋๋ก ๋ก์ง์ ์์ฑํ์ง ์๊ณ ๊ทธ๋ฆฌ๋ํ๊ฒ ๊ตฌํํด์ผ ํ๋ค. ์ฐฝ์๋ ฅ, ์ฆ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ๋ ๋ฅ๋ ฅ์ด ์๊ตฌ๋๋ค. ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ฆฌ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต์ง๋ง, ๋ง์ ๋ ์ฌ๋ฆฌ๊ณ ๋๋ฉด ๊ตฌํ์ ์ฌ์ด ๋ฌธ์ ์ด๋ค.
์๊ฐ๋ณต์ก๋
O(n)
N์ 10^7๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๊ณ , K๋ 1์ธ ์ต์
์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. N๊ฐ์ ๋ฌผ๋ณ์ ํ๋๋ก ํฉ์ณ์ผ ํ๋ฏ๋ก 10^7๋ณด๋ค ํฌ๋ฉด์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ด์ง์ x๋ก ๋ง๋ค์ด์ผ ํ๋ค.
์ค์ ๋ก ์ด ์ด์ง์ x๋ 2^24๋ก, 16,777,216์ด๋ค. (์ค์ ์ฝํ
์์๋ ๋๋ต 10,000,000 < x < 20,000,000 ์ ๋๋ก ๊ณ ๋ คํ๊ณ ๋์ด๊ฐ๋ค. )
๋ฌผ๋ณ์ ํ๋์ฉ ๋ํ๋ ๋นํจ์จ์ ์ธ ๋ก์ง์ ์ง๋๋ผ๋, ์ฐ์ฐ ํ์๋ 16,777,216 - 10,000,000 = 6,777,216 ์ด๋ค. ์ด๋ 1์ต์ ๋์ง ์์ผ๋ฏ๋ก ์๊ฐ์ด๊ณผ ์ผ๋ ค ์์ด ๋ก์ง์ ์ง๋ฉด ๋๋ค.
โ๏ธ๋ด ์์ค์ฝ๋
Idea
(1) 13์ ์ด์ง์ 1101 โ 8๋ฆฌํฐ, 4๋ฆฌํฐ, 1๋ฆฌํฐ ๋ฌผ๋ณ ์ด 3๊ฐ
(2) 1101๋ฅผ ์ญ์์ผ๋ก ๋ดค์ ๋ 1์ด ์ฒ์ ๋ฑ์ฅํ๋ ์ธ๋ฑ์ค๋ 0์ด๋ค.
(3) << ์ผ์ชฝ ์ฌํํธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
(4) 1101 + (1 << 0) = 1101 + 1 = 1110 โ 8๋ฆฌํฐ, 4๋ฆฌํฐ, 2๋ฆฌํฐ ๋ฌผ๋ณ ์ด 3๊ฐ
(5) 1110๋ฅผ ์ญ์์ผ๋ก ๋ดค์ ๋ 1์ด ์ฒ์ ๋ฑ์ฅํ๋ ์ธ๋ฑ์ค๋ 1์ด๋ค.
(6) << ์ผ์ชฝ ์ฌํํธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
(7) 1110 + (1 << 1) = 1110 + 10 = 10000 โ 16๋ฆฌํฐ ๋ฌผ๋ณ 1๊ฐ
<< ์ผ์ชฝ ์ฌํํธ ์ฐ์ฐ์๋?
- ์ฌํํธ ์ฐ์ฐ์ ์ขํญ์ ์๋ ํผ์ฐ์ฐ์๋ฅผ ์ฐํญ์ ์๋ ์๋งํผ ๋นํธ ์๋ฆฌ ์ด๋ํ๋ ์ฐ์ฐ์ ์ํํ๋ค.
- << ๋ ์ผ์ชฝ ์ฌํํธ ์ฐ์ฐ์์ด๊ณ >> ๋ ์ค๋ฅธ์ชฝ ์ฌํํธ ์ฐ์ฐ์์ด๋ค.
- << ์ผ์ชฝ ์ฌํํธ ์ฐ์ฐ์ ํ๋ฉด ์ขํญ์ ์๋ ํผ์ฐ์ฐ์์ ๊ฐ์ด ์ฐํญ์ ์๋ ์๋งํผ ์ผ์ชฝ์ผ๋ก ์๋ฆฌ ์ด๋ํ๊ณ ๋น ์๋ฆฌ๋ 0์ผ๋ก ์ฑ์ด๋ค.
์์ค์ฝ๋
import sys
si = sys.stdin.readline
n, k = map(int, si().split())
m = n
while bin(m).count('1') > k:
ridx = bin(m)[::-1].index('1')
m += (1 << ridx)
print(m - n)
- ์์ ์์ 1๋ฆฌํฐ ๋ฌผ๋ณ์ ํ๋์ฉ ์ฌ๋ ๋ก์ง (๋นํจ์จ์ )
import sys
si = sys.stdin.readline
n, k = map(int, si().split())
m = n
while True:
cnt = bin(m).count('1')
if cnt <= k:
break
m += 1
print(m - n)