ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

[๋ฐฑ์ค€ 1052] ๋ฌผ๋ณ‘ (Python)

์€์ง„ 2022. 6. 7. 20:50

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๋ฌธ์ œ์„ค๋ช…

[๋ฐฑ์ค€ 1052] ๋ฌผ๋ณ‘ (Python)
์ด์ฝ”ํ…Œ

โœ๏ธ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์–ต์„ ๋„˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ ์—ผ๋ ค ์—†์ด ๋กœ์ง์„ ์งœ๋ฉด ๋œ๋‹ค.


โœ๏ธ๋‚ด ์†Œ์Šค์ฝ”๋“œ

๋ฌผ๋ณ‘์˜ˆ์ œ2๋ฒˆ

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)