[BOJ][๐ก3][๋ฐฑ์ค#18235] ์ง๊ธ ๋ง๋๋ฌ ๊ฐ๋๋ค
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold III
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์ฌํ์ ๋ง์น๊ณ ๊ฝ๊ฝ๋๋ผ๋ก ๋์๊ฐ๋ ์ค ์ค๋ฆฌ์ ์ก๋ฆฌ๋ ์๋ก๋ฅผ ์์ด๋ฒ๋ ธ๋ค. ํ์ฌ ์ค๋ฆฌ๋ ์ A์ ์๊ณ , ์ก๋ฆฌ๋ ์ B์ ์๋ค. ์ค๋ฆฌ์ ์ก๋ฆฌ๋ ์๋ก๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ฌด์กฐ๊ฑด ํ๋ฃจ์ ํ ๋ฒ์ฉย ์ ํ๋ฅผ ํ๋ค.ย 1์ผ์ฐจ์๋ 1๋งํผย ์ ํํ๊ณ ํ๋ฃจ๊ฐ ์ง๋ ๋๋ง๋ค ์๋ก๊ฐ ๋์ฑ ๋ณด๊ณ ์ถ์ ๋๋จธ์ง ๋ ๋ฐฐ์ฉ ๋ ๋ฉ๋ฆฌ ์ ํํ๋ค. ์ฆ, ํ์ฌ ์์น๊ฐ X์ด๊ณ ์๋ก๋ฅผ ์ฐพ๊ธฐ ์์ํ ์ง y์ผ์ฐจ๋ผ๋ฉดย ์ X + 2y-1ย ๋๋ย ์ X -ย 2y-1๋ก ์ ํํ๋ค. 0 ์ดํ์ ์ ๋ค๊ณผ N+1ย ์ด์์ ์ ๋ค์ ๋๋ย ๋ ์ด ์๊ธฐ ๋๋ฌธ์ย ๊ทธ๊ณณ์ผ๋ก ์ ํํ๋ค๋ฉด ์ค๋ฆฌ์ ์ก๋ฆฌ๋ ์์ํ ๋ง๋์งย ๋ชปํ๋ค. ์๋ ๊ทธ๋ฆผ์ Nย = 10, Aย = 4, Bย = 10์ผ ๋์ ์์์ด๋ค. ํ์ดํ๋ ์ ํ ๊ฐ๋ฅํ ์์น๋ฅผ ๋ํ๋ธ๋ค.
์ค๋ฆฌ์ ์ก๋ฆฌ์ ์์น๊ฐ ์ฃผ์ด์ก์ ๋, ๋์ด ๋ง๋ ์ ์๋ ์ต์ ์ผ์๋ฅผ ๊ตฌํด๋ณด์. ๊ฐ์ ๋ ย ๊ฐ์ ์ ์ ๋ ์ ๋์ฐฉํ์ย ๋ย ์ค๋ฆฌ์ ์ก๋ฆฌ๊ฐ ๋ง๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ์ธ ์ ์ N, A, B๊ฐ ์ฃผ์ด์ง๋ค.ย (2 โค N โคย 500,000, 1 โคย A, B โค N, A โ B)
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ์ค๋ฆฌ์ ์ก๋ฆฌ๊ฐ ๋ง๋ ์ ์๋ ์ต์ ์ผ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ์ค๋ฆฌ์ ์ก๋ฆฌ๊ฐ ์์ํย ๋ง๋ ์ ์๋ค๋ฉดย -1์ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
10 4 10
์ถ๋ ฅ
2
์์ 2
์ ๋ ฅ
2 1 2
์ถ๋ ฅ
-1
์์ 3
์ ๋ ฅ
7 2 6
์ถ๋ ฅ
2
My Sol
def move(C):
global n, day
jump = 2**day
new_C = set()
for c in C:
for op in (1, -1):
if 0 < c+op*jump <= n:
new_C.add(c+op*jump)
return new_C
n, a, b = map(int, input().split())
A, B = {a}, {b}
day = 0
while True:
if not (A and B):
day = -1
break
A, B = move(A), move(B)
day += 1
if A & B: break
print(day)
set์ ํด์๋ฅผ ์ด์ฉํ๋ฉด ๊ต์ฅํ ์ฝ๊ฒ ํ ์ ์๋ ๋ฌธ์ ์๋ค. ์์์ ์ผ๋ก๋ถํฐ 1์ผ์ฐจ์๋ 1๋งํผ, 2์ผ์ฐจ์๋ 2๋งํผโฆ n์ผ์ฐจ์๋ 2**(n-1)๋งํผ ์ด๋ํ๋ ๊ฒ์ ์ดํดํ๋ค.
- ์ ๋ ฅ๋ ์ด๊ธฐ ์์น๋ฅผ A, B set์ ๊ฐ๊ฐ ๋ฃ์ด์ค๋ค.
- ํด๋น ์์น๋ถํฐ 2**(n-1) step์ ์ด๋ํ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ set์ ์ถ๊ฐํด์ค๋ค.
- set์ ๊ต์งํฉ์ ํ์ฉํด ์ด๋ ํ ๋ ์ A, B set์ด ์ผ์นํ๋ ํฌ์ธํธ๊ฐ ์๋ค๋ฉด, ์ฆ ์ด๋ ํ ๋ ์ ๊ฐ์ ํฌ์ธํธ์ ๋์ฐฉํ ์ ์๋ค๋ฉด while๋ฌธ์ ์ข ๋ฃํ๋ค.
- ๋ง์ฝ ๋ ์ง๊ฐ ๋ง์ด ์ง๋ ์ด๋ ๊ฑฐ๋ฆฌ๊ฐ ๋๋ฌด ์ปค์ง๊ฒ ๋๋ฉด ํน์ ํ ๋ ์ A, B ์ค ํ ํฌ์ธํธ๋ ๋ฒ์ ๋ด์์ ์ด๋ํ ์ ์๋ค๋ฉด ๋ฐ๋ณต์ ์ข ๋ฃํ๊ณ -1์ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ