[Baekjoon/๐ฅSilverโ ] 1074: Z
๐โโ๏ธ 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๋ฐฐ๊ฐ ๋๋ ๊ฒ์ ์๋๋ค! ๋ฐ๋ผ์ ๊ทธ ์ค์ฐจ๋ฅผ ํด๊ฒฐํด์ฃผ๋ ์ญํ ์ด ์์ ์์ด ๋๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ