[Baekjoon/๐ŸฅˆSilverโ… ] 1074: Z

2 ๋ถ„ ์†Œ์š”

๐Ÿ™‹โ€โ™€๏ธ Z

๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์œ„ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ !!

๐Ÿ™‹โ€โ™€๏ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ N, r, c๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๐Ÿ™‹โ€โ™€๏ธ ์ถœ๋ ฅ

rํ–‰ c์—ด์„ ๋ช‡ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ™‹โ€โ™€๏ธ ์ œํ•œ

  • 1 โ‰ค N โ‰ค 15
  • 0 โ‰ค r, c < 2^N


๐Ÿ‘ฉโ€๐Ÿ’ป Algoritm: Dvide and Conquer(1)

์‚ฌ์‹ค ํ•„์ž๊ฐ€ ์ž‘์„ฑํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์™„๋ฒฝํ•œ ๋ถ„ํ•  ์ •๋ณต์— ํ•ด๋‹น๋˜์ง€๋Š” ์•Š๋Š”๋‹ค! ํ•˜์ง€๋งŒ ๋ฐ˜๋ณต๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•ด ๋‹จ๊ณ„๋ณ„๋กœ ๋™์ผํ•œ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์—ฌ ์ตœ์ข… ๋‹ต์„ ๊ตฌํ–ˆ๋‹ค๋Š” ์ ์—์„œ ๋ถ„ํ• ์ •๋ณต์„ ์ ์šฉํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฐ”๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ถ€ํ„ฐ ํ™•์ธํ•œ ํ›„, ํ•œ ์ค„์”ฉ ๋ถ„์„ํ•ด๋ณด์ž!

n, r, c = map(int, input().split())

answer = 0

while n > 0:
  answer += (r//2**(n-1))*(2**(n-1)*2**(n-1)*2) # ...1
  answer += (c//2**(n-1))*2**(n-1)*2**(n-1) # ...2

  r -= (r//2**(n-1))*2**(n-1) # ...3
  c -= (c//2**(n-1))*2**(n-1) # ...4
  
  n -= 1
print(answer)

์‹๋งŒ ๋ณด๋ฉด ๊ทธ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค ๊ฒƒ์ด๋‹ค! ๋‹ค์Œ์˜ ๊ทธ๋ฆผ๊ณผ ํ•จ๊ป˜ ์‚ดํŽด๋ณด์ž! ์•„๋ž˜ ๊ทธ๋ฆผ์˜ ์ƒํ™ฉ์€ n=3/r=4/c=5์ธ ๊ฒฝ์šฐ์ด๋‹ค.

  • r > ๋ณ€์˜ ๊ธธ์ด ์ ˆ๋ฐ˜(์œ„์—์„œ๋Š” 4)
    • ์ ˆ๋ฐ˜ ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•(4*4) 2๊ฐœ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค.
  • c > ๋ณ€์˜ ๊ธธ์ด ์ ˆ๋ฐ˜(์œ„์—์„œ๋Š” 4)
    • ์ ˆ๋ฐ˜ ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•(4*4) 1๊ฐœ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค.
  • ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์‚ฌ๊ฐํ˜•์˜ ๊ฐœ์ˆ˜๋ฅผ answer์— ๋”ํ•ด์คฌ์œผ๋ฏ€๋กœ r, c์˜ ๊ฐ’์„ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค.
    • r > 4์ผ ๊ฒฝ์šฐ, 4๋ฅผ ๋นผ์ค€๋‹ค. r <= 4์ผ ๊ฒฝ์šฐ, ์•„๋ฌด ๊ฐ’๋„ ๋นผ์ง€ ์•Š๋Š”๋‹ค.
    • c > 4์ผ ๊ฒฝ์šฐ, 4๋ฅผ ๋นผ์ค€๋‹ค. c <= 4์ผ ๊ฒฝ์šฐ, ์•„๋ฌด ๊ฐ’๋„ ๋นผ์ง€ ์•Š๋Š”๋‹ค.

n์˜ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ค„์—ฌ๊ฐ€๋ฉฐ ๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ ์ „๊ฐœ๊ฐ€ ๋œ๋‹ค.


๐Ÿ‘ฉโ€๐Ÿ’ป Algoritm: Dvide and Conquer(2)

n, r, c = map(int, input().split())

answer = 0

while n > 0:
  if r < 2**(n-1) and c < 2**(n-1): #1์‚ฌ๋ถ„๋ฉด
    answer += 2**(n-1) * 2**(n-1) * 0
  elif r < 2**(n-1) and c >= 2**(n-1): #2์‚ฌ๋ถ„๋ฉด
    answer += 2**(n-1) * 2**(n-1) * 1
    c -= 2**(n-1)
  elif r >= 2**(n-1) and c < 2**(n-1):#3์‚ฌ๋ถ„๋ฉด
    answer += 2**(n-1) * 2**(n-1) * 2
    r -= 2**(n-1)
  elif r >= 2**(n-1) and c >= 2**(n-1):#4์‚ฌ๋ถ„๋ฉด
    answer += 2**(n-1) * 2**(n-1) * 3
    r -= 2**(n-1)
    c -= 2**(n-1)

  n -= 1

print(answer)

ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค!

๋‹ค์Œ์œผ๋กœ๋Š” ์žฌ๊ท€๋ฅผ ์ด์šฉํ•œ ํ’€์ด์ด๋‹ค!


๐Ÿ‘ฉโ€๐Ÿ’ป Algoritm: ์žฌ๊ท€

๐Ÿ™„ ์žฌ๊ท€๋ฅผ ์ด์šฉํ•ด ํ’€์ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทœ์น™์„ฑ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์„ ํ™•์ธํ•ด๋ณด์ž!!

์œ„ ๊ทธ๋ฆผ์—์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์˜ ๊ทœ์น™์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

x, y ๊ฐ’์ด 2๋ฐฐ๊ฐ€ ๋˜๋ฉด ๊ทธ ๊ฐ’์€ 4๋ฐฐ๊ฐ€ ๋œ๋‹ค.

  • (2,0) = 8 -> (4,0) = 32
  • (3,0) = 10 -> (6,0) = 40

๋”ฐ๋ผ์„œ ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

def getAnswer(N, r, c):
  if N == 0:
    return 0
  return 2*(r%2)+(c%2) + 4 * getAnswer(N-1, r//2, c//2)

n, r, c = map(int, input().split())

print(getAnswer(n, r, c))

๐Ÿ™„ ์—ฌ๊ธฐ์„œ 2*(r%2)+(c%2)๊ฐ€ ๋ฌด์Šจ ์—ญํ• ์ธ์ง€ ๊ถ๊ธˆํ•  ๊ฒƒ์ด๋‹ค!!

  • ๊ทธ๋ ‡๋‹ค! ํ•ญ์ƒ x, y์˜ ๊ฐ’์ด ์ •ํ™•ํžˆ 2๋ฐฐ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค! ๋”ฐ๋ผ์„œ ๊ทธ ์˜ค์ฐจ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์ด ์œ„์˜ ์‹์ด ๋œ๋‹ค.


๐Ÿ“ ์ฐธ๊ณ  ์ž๋ฃŒ

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ