ํฐ์คํ ๋ฆฌ ๋ทฐ
๐จ๐ป ์ฝ๋ฉํ
์คํธ/๋ฐฑ์ค
๋ฐฑ์ค: 20058 ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด์คํฐ
dirmathfl 2021. 4. 14. 01:32728x90
๋ฐ์ํ
๋ฌธ์
๋ฌธ์ ํ์ด
์๋ฎฌ๋ ์ด์ ๋ฌธ์ ๋ก, ๋ฌธ์ ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๋๋ ๋ฌธ์ ์ด๋ค. ๋ฌธ์ ์ ์ ์๋ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
- `2 ^ L * 2 ^ L` ํฌ๊ธฐ๋งํผ์ ๊ฒฉ์๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ๋ค.
- 90๋๋ก ํ์ ํ๋ ๊ฒ์ L์ด 1์ธ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- `[[1, 2], [3, 4]]`๊ฐ ์๋ ๊ฒฝ์ฐ `↑` ์ ๋ฐฉํฅ์ผ๋ก ์ฝ์ผ๋ฉด `[3, 1], [4, 2]`๊ฐ ๋๋ค.
- ์ด๋ฅผ `→` ์ฐ์ธก์ผ๋ก ์ฐ๊ฒ ๋๋ฉด `[[3, 1], [4, 2]]`๋ก 90๋ ํ์ ํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
- ๊ฐ ์ผ์์ ์ธ์ ํ ์ผ์(์, ํ, ์ข, ์ฐ)์ ๊ฐ์๊ฐ 3๊ฐ ๋ฏธ๋ง์ด๋ผ๋ฉด ์ผ์์ด ๋
น์ 1 ๊ฐ์ํ๋ค.
- (0, 0)๊ณผ ๊ฐ์ด ์ธ์ ํ ๊ณณ์ด 2์ธ ๊ณณ์ด๋ค.
- ์ธ์ ํ ์ผ์์ด 0์ด๋ผ๋ฉด, ์ผ์์ด ์๋ ๊ฒ์ด๋ค.
- Q๋ฒ ์์ 1, 2 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ๋จ์ ์๋ ์ผ์์ ํฉ๊ณผ ๋จ์ ์๋ ์ผ์ ์ค ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
- ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์นธ์ ๊ฐ์๋ ์ผ์์ด ์ฐ๊ฒฐ๋ ํฌ๊ธฐ๋ฅผ ๋งํ๋ค.
- ์ด๋ ๋ฐฑ์ค: 2667 ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ์ ์๊ตฌ ์ฌํญ๊ณผ ๋์ผํ๋ค.
๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ฃผ์ํ ์ฌํญ์, ๋ น์ฌ์ผ ํ๋ ์ผ์์ ์ฆ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ค๋ฅธ ์ผ์์ ํ์ ๊ณผ์ ์์ ํด๋น ์ผ์์ด 0์ด ๋๊ฒ ๋๋ฉด ์ง๊ธ ๋ น์์ผ ํ ์ผ์์ด ์๋๋ฐ๋ ๋ น์ด๋ ์ํฉ์ด ๋ฐ์ํ๋ฏ๋ก ์ฃผ์ํ์ฌ์ผ ํ๋ค.
์ผ์ฑ ์๋ฎฌ๋ ์ด์ ๋ฌธ์ ๋ค์, ํ๋ ฌ์ ์กฐ์ํ๋ ๋ฌธ์ ๋ค์ด ๋ง์ ํธ์ด๋ค. ๋ฐ๋ผ์ ๋น์ทํ ์ ํ์ ์ ํ๊ณ ํ๋ ฌ์ ์กฐ์ํ๋ ์ฝ๋๋ฅผ ์๊ธฐํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ผ ๊ฒ ๊ฐ๋ค.
์ฝ๋
from sys import stdin
from collections import deque
def visitable(r, c):
return 0 <= r < N and 0 <= c < N and board[r][c]
def rotate(loc, l):
cur_r, cur_c = loc
'''
์๋ฅผ ๋ค์ด ๊ฒฉ์์ ๊ฐ์ด ๋ค์๊ณผ ๊ฐ๋ค๋ฉด,
1 2 3 1
3 4 4 2
↑๋ก ์ฝ๊ณ →๋ก ์ฐ๋ฉด
90๋ ํ์
'''
for r in range(l):
for c in range(l):
# read ↑
temp[r][c] = board[cur_r + l - 1 - c][cur_c + r]
for r in range(l):
for c in range(l):
# write →
board[cur_r + r][cur_c + c] = temp[r][c]
def simulation(l):
# 1. ๊ฒฉ์ ํฌ๊ธฐ ๋งํผ 90๋ ํ์ .
for r in range(0, N, l):
for c in range(0, N, l):
rotate((r, c), l)
check = [[0 for _ in range(N)] for _ in range(N)]
# 2-1. ์ธ์ ํ ์ผ์์ด 3๊ฐ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ ์ฐพ๊ธฐ.
for r in range(N):
for c in range(N):
if not board[r][c]:
continue
adj_cnt = 0
for dr, dc in dirs:
next_r, next_c = r + dr, c + dc
if visitable(next_r, next_c):
adj_cnt += 1
# check ํ์ง ์๊ณ , ๋ฐ๋ก ๋
น์ด๊ฒ ๋๋ฉด ํ์์ ์ํฅ์ ๋ฐ์.
check[r][c] = 1 if adj_cnt < 3 else 0
# 2-2. ์ฐพ์ ์ผ์ ๋
น์ด๊ธฐ.
for r in range(N):
for c in range(N):
if check[r][c]:
board[r][c] -= 1
# ๋ฐฑ์ค: 4963 ์ฌ์ ๊ฐ์์ ๊ฐ์ ๋ก์ง
def bfs(start):
q = deque([start])
cnt = 1
while q:
cur_r, cur_c = q.popleft()
for dr, dc in dirs:
next_r, next_c = cur_r + dr, cur_c + dc
if visitable(next_r, next_c) and not visited[next_r][next_c]:
visited[next_r][next_c] = 1
q.append((next_r, next_c))
cnt += 1
return cnt
if __name__ == '__main__':
N, Q = map(int, stdin.readline().split())
N = 2 ** N
board = [list(map(int, stdin.readline().split())) for _ in range(N)]
L = list(map(int, stdin.readline().split()))
max_l = max(L)
temp = [[0 for _ in range(2 ** max_l)] for _ in range(2 ** max_l)]
visited = [[0 for _ in range(N)] for _ in range(N)]
dirs = ((-1, 0), (1, 0), (0, -1), (0, 1))
for cur_l in L:
simulation(2 ** cur_l)
# Answer 1: ๋จ์ ์๋ ์ผ์์ ์ดํฉ.
sum_ice = sum(sum(board, []))
print(sum_ice)
# Answer 2: ๋จ์ ์๋ ์ผ์ ์ค ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์นธ์ ๊ฐ์.
max_ice = 0
for i in range(N):
for j in range(N):
if board[i][j] and not visited[i][j]:
visited[i][j] = 1
max_ice = max(max_ice, bfs((i, j)))
print(max_ice)
728x90
๋ฐ์ํ
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 17779 ๊ฒ๋ฆฌ๋ฉ๋๋ง 2 (0) | 2021.04.16 |
---|---|
๋ฐฑ์ค: 19238 ์คํํธ ํ์ (0) | 2021.04.15 |
๋ฐฑ์ค: 20055 ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์ ๋ก๋ด (0) | 2021.04.13 |
๋ฐฑ์ค: 14567 ์ ์๊ณผ๋ชฉ(Prerequisite) (0) | 2021.04.13 |
๋ฐฑ์ค: 17485 ์ง์ฐ์ ๋ฌ ์ฌํ (Large) (0) | 2021.04.09 |
๋๊ธ
๊ธ ๋ณด๊ดํจ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ