-
[๋ฐฑ์ค] 12100 2048(easy) with PythonPS 2021. 10. 25. 23:34728x90๋ฐ์ํ
๐ BOJ 12100 2048(easy)
๐ก ์กฐ๊ฑด
๋ณด๋์ ํฌ๊ธฐ๋
N * N
(1 โค N โค 20)
0
์ ๋น์นธ, ์ด์ธ์ ๊ฐ์ ๋ธ๋ก์ ๊ฐ๋ค์ ๋ํ๋ธ๋ค.
๋ธ๋ก์ ์ฐ์ฌ ์๋ ์๋2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 1024๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ 2์ ์ ๊ณฑ๊ผด
์ด๋ค.
๋ธ๋ก์ ์ ์ด๋ ํ๋ ์ฃผ์ด์ง๋ค.๊ฐ์ ๊ฐ์ ๊ฐ๋ ๋ ๋ธ๋ก์ด ์ถฉ๋ํ๋ฉด ๋ ๋ธ๋ก์ ํ๋๋ก ํฉ์ณ์ง๊ฒ ๋๋ค.
ํ ๋ฒ์ ์ด๋์์ ์ด๋ฏธ ํฉ์ณ์ง ๋ธ๋ก์ ๋ ๋ค๋ฅธ ๋ธ๋ก๊ณผ ๋ค์ ํฉ์ณ์ง ์ ์๋ค.
์ต๋ ๋ค์ฏ๋ฒ ์ด๋
์์ผ์ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ๊ฐ์ ์ถ๋ ฅ.๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ ์ ํ์ ๋ฌธ์
๐ฅ ์์ค ์ฝ๋
from sys import stdin, setrecursionlimit from collections import deque setrecursionlimit(int(1e9)) n = int(stdin.readline()) arr = [list(map(int, stdin.readline().split())) for _ in range(n)] answer, q = 0, deque() def get(i, j): if arr[i][j]: q.append(arr[i][j]) arr[i][j] = 0 def merge(i, j, di, dj): while q: x = q.popleft() if not arr[i][j]: arr[i][j] = x elif arr[i][j] == x: arr[i][j] = x * 2 i, j = i + di, j + dj else: i, j = i + di, j + dj arr[i][j] = x def move(k): if k == 0: for j in range(n): for i in range(n): get(i, j) merge(0, j, 1, 0) elif k == 1: for j in range(n): for i in range(n - 1, -1, -1): get(i, j) merge(n - 1, j, -1, 0) elif k == 2: for i in range(n): for j in range(n): get(i, j) merge(i, 0, 0, 1) else: for i in range(n): for j in range(n - 1, -1, -1): get(i, j) merge(i, n - 1, 0, -1) def recursive(count): global arr, answer if count == 5: for i in range(n): answer = max(answer, max(arr[i])) return b = [x[:] for x in arr] for k in range(4): move(k) recursive(count + 1) arr = [x[:] for x in b] recursive(0) print(answer)
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
3 2 2 2 4 4 4 8 8 8
์คํ๊ฒฐ๊ณผ
16
โจ๏ธ ๋ฌธ์ ํ์ด
๋ฐฑํธ๋ํน์ ์ฌ๊ท๊ฐ ๊ฐ์ฅ ํต์ฌ.
๋ฐฑํธ๋ํน์ ์ํํ๋ฉฐ ์ฌ๊ท๋ฅผ ์งํํrecursive
ํจ์์ ํ๋ผ๋ฏธํฐ๋ฅผcnt
๋ก ์ฃผ๊ณ , ์ฒซ ์คํ์์๋0
์ ์ฃผ๊ณ ์คํ์ํจ๋ค.
- N์ ํฌ๊ธฐ๊ฐ ์๊ธฐ ๋๋ฌธ์
deep copy
๋ฅผ ์ด์ฉํ ๋ฐฐ์ด๋ณต์ฌ๊ฐ ๊ฐ๋ฅํ๋ค.
์ด๋ฅผ ํตํด ๋ฐฉํฅ์ ๋ฐ๊พธ๊ธฐ ์ , ์ด์ ๋ณด๋์ ์ํ๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ํ ์์ค์ฝ๋๋ฅผ ์์ฑํ๋ค.
์์ง์ด๊ธฐ ์ ๋ณด๋์ ์ํฉ์ ๊ธฐ์ตํด๋์ง ์์ผ๋ฉด, ๋ฐฑํธ๋ํน์ด ์ํ๋ ์ ์๋ค.b = [x[:] for x in arr]
- ๋ค ๋ฐฉํฅ์ผ๋ก ๋ธ๋ก์ ์์ง์ผ ์ ์์ผ๋, ๋ฐ๋ณต๋ฌธ์ ํตํด ๋ค ๋ฐฉํฅ์ผ๋ก ์์ง์ฌ์ค๋ค.
move()
ํจ์์์k
์ ๊ฐ์ ๋ฐ๋ผ ๋ค ๋ฐฉํฅ์ผ๋ก ์์ง์ฌ ์ค๋ค.def move(k): # arr[i][j] if k == 0: # ์๋ก ์ด๋, ๋ธ๋ฝ๋ค์ด ์๋ก ๋ชจ๋ ์ด๋ํ๋ฉด row index๋ 0 for j in range(n): for i in range(n): get(i, j) merge(0, j, 1, 0) # row index 1์ฉ ์ฆ๊ฐํ๋ฉด์ ์๋์ชฝ ๋ธ๋ฝ๋ค์ ํฉ์ณ๊ฐ elif k == 1: # ์๋๋ก ์ด๋, ๋ธ๋ฝ๋ค์ด ์๋๋ก ๋ชจ๋ ์ด๋ํ๋ฉด row index๋ n-1 for j in range(n): for i in range(n - 1, -1, -1): get(i, j) merge(n - 1, j, -1, 0) # row ์ธ๋ฑ์ค 1์ฉ ๊ฐ์ํ๋ฉด์ ์์ชฝ๋ค์ ํฉ์ณ๊ฐ elif k == 2: # ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋, column index๋ 0 for i in range(n): for j in range(n): get(i, j) merge(i, 0, 0, 1) # column ์ธ๋ฑ์ค ์ฆ๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ else: # ์ผ์ชฝ์ผ๋ก ์ด๋, column index๋ n-1 for i in range(n): for j in range(n - 1, -1, -1): get(i, j) merge(i, n - 1, 0, -1) # column ์ธ๋ฑ์ค ๊ฐ์ ์ผ์ชฝ์ผ๋ก ์ด๋
get()
ํจ์์์ ์์ง์ผ ๋ณด๋๋ค์ ์ํ๋ฅผ ํ์ธํ๋ฉด์ ์์ฐจ์ ์ผ๋ก ์ํํด์ฃผ๊ณ ,
์ํํ๋ฉด์ ๋ฐฐ์ด ์์์ ๊ฐ์ด0
์ด ์๋ ๊ฒฝ์ฐ, ์์์ ๊ฐ์ํ
์ ๋ฃ์ด์ค๋ค.
๋ฐฐ์ด์ ๋ฃ์ ๊ฐ์ด ์๋ ํด๋น ์๋ฆฌ๋0
์ผ๋ก ๋ฐ๊ฟ์ค๋ค.def get(i, j): if arr[i][j]: # 0์ด ์๋ ๊ฐ์ด๋ผ๋ฉด q.append(arr[i][j]) # queue์ arr์ ๊ฐ์ ๋ฃ๋๋ค. arr[i][j] = 0 # ์ฒ๋ฆฌ๊ฐ ๋ ๋น ์๋ฆฌ๋ 0์ผ๋ก ๊ฐ ์ ๋ฐ์ดํธ
merge()
ํจ์์์ ๊ฐ ์ด๋ํ๋ ค๋ ๋ฐฉํฅ์ ์๋ง๊ฒ ์ธ๋ฑ์ค๋ฅผ ์กฐ์ ํ๋ฉฐ ํ๊ฐ ๋น๋๊น์ง ๋ฐ๋ณตํ๋ฉฐ ํฉ์ณ์ค๋ค.
์์ง์ด๋ ค๋ ๊ฐ์ ๋ธ๋ก์ํ
์์ ๊บผ๋ด์จ ํ, ๋์ ๊ณณ์ ๋ธ๋ญ์ ๊ฐ์ด0
์ด๋ผ๋ฉด ๊ทธ๋ฅ ๋๊ณ ,
๊ฐ์ด ์ผ์นํ๋ค๋ฉด 2์ ์ ๊ณฑ ๊ผด์ด๊ธฐ์ 2๋ฐฐ๋ฅผ ํด์ค๋ค.
๊ฐ์ด ์ผ์น ํ์ง ์๋๋ค๋ฉด ๊ทธ ์๋ฆฌ์ ๊ทธ๋๋ก ๋๋ค.
def merge(i, j, di, dj): # row index, column index, y๋ฐฉํฅ, x๋ฐฉํฅ while q: x = q.popleft() # ์์ง์ด๋ ค๋ ๋ธ๋ก ๊ฐ์ ๊ฐ์ ธ์จ๋ค. FIFO if not arr[i][j]: # 0์ด๋ผ๋ฉด ๊ทธ๋๋ก ๋๋๋ค. arr[i][j] = x elif arr[i][j] == x: # ๊ฐ์ด ์ผ์นํ๋ค๋ฉด arr[i][j] = x * 2 # ํฉ์ณ์ง๋ฏ๋ก 2๋ฐฐ๋ก ์ฆ๊ฐ i, j = i + di, j + dj else: # ๊ฐ์ด ์ผ์นํ์ง ์์ผ๋ฉด i, j = i + di, j + dj arr[i][j] = x
move()
ํจ์์ ์ฒ๋ฆฌ๊ฐ ๋๋ฌ๋ค๋ฉด,cnt + 1
์ ํ๋ผ๋ฏธํฐ๋ก ์ฃผ๊ณ ,recursive
ํจ์๋ฅผ ์ฌ๊ทํธ์ถ ํด์ค๋ค.
3๋ฒ
๋ถํฐ ๋ค์ ๋ฐ๋ณตํ๋ฉด์,cnt ๊ฐ์ด 5, ์ฆ ๋ค์ฏ๋ฒ ์์ง์์ ๋
, ๋ณด๋ํ์ ์ํํ๋ค.
๊ฐ ๋ฐฐ์ด์ ์ต๋๊ฐ๊ณผ ์ ๋ต์ผ๋ก ์ถ๋ ฅํans
๊ฐ์ ๋น๊ตํ์ฌ ๊ฐฑ์ ํ๋ค.
๐พ ๋๋์
- ์ฌ๊ทํจ์๋ฅผ ์ผ๋ง๋ ์์ฉ์ ํ ์ ์๋์ง์ ๋ํ ๋ฌธ์ ์๋ค.
- get(), move() ํจ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ด๋ ค์ ์ผ๋ฉฐ, ์ด ๋ถ๋ถ์ ๋ค๋ฅธ ๋ธ๋ก๊ทธ์์ ์์ด๋์ด๋ฅผ ์ป์ด ํด๊ฒฐํ๋ค.
- ๋ช ๋ฒ์ด๊ณ ๋ค์ ํ์ด๋ณด๊ธฐ ์ข์ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค. ์ฃผ๋ง์ ๋ค์ ํ ๋ฒ ํ์ด๋ณด๋ ๊ฒ์ด ์ข๊ฒ ๋ค.
๋ฐ์ํ'PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 14725 ๊ฐ๋ฏธ๊ตด with Python (0) 2021.11.21 [๋ฐฑ์ค] 13334 ์ฒ ๋ก with Python (0) 2021.10.25 [๋ฐฑ์ค] 1043 ๊ฑฐ์ง๋ง with Python (0) 2021.10.20 [๋ฐฑ์ค] 3184 ์ with Python (0) 2021.10.19 [๋ฐฑ์ค] 2343 ๊ธฐํ ๋ ์จ with Python (0) 2021.10.19