[๋ฐฑ์ค/python] 2667๋ฒ : ๋จ์ง๋ฒํธ ๋ถ์ด๊ธฐ
๋ฌธ์
<๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ ์ฌ๊ฐํ ๋ชจ์์ ์ง๋๊ฐ ์๋ค. 1์ ์ง์ด ์๋ ๊ณณ์, 0์ ์ง์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ์ฒ ์๋ ์ด ์ง๋๋ฅผ ๊ฐ์ง๊ณ ์ฐ๊ฒฐ๋ ์ง์ ๋ชจ์์ธ ๋จ์ง๋ฅผ ์ ์ํ๊ณ , ๋จ์ง์ ๋ฒํธ๋ฅผ ๋ถ์ด๋ ค ํ๋ค. ์ฌ๊ธฐ์ ์ฐ๊ฒฐ๋์๋ค๋ ๊ฒ์ ์ด๋ค ์ง์ด ์ข์ฐ, ํน์ ์๋์๋ก ๋ค๋ฅธ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ๋๊ฐ์ ์์ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ ์ฐ๊ฒฐ๋ ๊ฒ์ด ์๋๋ค. <๊ทธ๋ฆผ 2>๋ <๊ทธ๋ฆผ 1>์ ๋จ์ง๋ณ๋ก ๋ฒํธ๋ฅผ ๋ถ์ธ ๊ฒ์ด๋ค. ์ง๋๋ฅผ ์ ๋ ฅํ์ฌ ๋จ์ง์๋ฅผ ์ถ๋ ฅํ๊ณ , ๊ฐ ๋จ์ง์ ์ํ๋ ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ง๋์ ํฌ๊ธฐ N(์ ์ฌ๊ฐํ์ด๋ฏ๋ก ๊ฐ๋ก์ ์ธ๋ก์ ํฌ๊ธฐ๋ ๊ฐ์ผ๋ฉฐ 5≤N≤25)์ด ์ ๋ ฅ๋๊ณ , ๊ทธ ๋ค์ N์ค์๋ ๊ฐ๊ฐ N๊ฐ์ ์๋ฃ(0ํน์ 1)๊ฐ ์ ๋ ฅ๋๋ค.
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ด ๋จ์ง์๋ฅผ ์ถ๋ ฅํ์์ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋จ์ง๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ์์ค.
์ ๋ต
import sys
input = sys.stdin.readline
N = int(input())
houses = [list(map(int, list(input().strip()))) for _ in range(N)]
visited = [list(False for _ in range(N)) for _ in range(N)]
blocks = {}
def DFS(i, j, number):
stack = [[i, j]]
blocks[number] = 0
while stack:
n = stack.pop()
if houses[n[0]][n[1]] == 1 and visited[n[0]][n[1]] == False:
visited[n[0]][n[1]] = True
blocks[number] += 1
if n[0] - 1 >= 0:
stack.append([n[0] - 1, n[1]])
if n[0] + 1 < N:
stack.append([n[0] + 1, n[1]])
if n[1] - 1 >= 0:
stack.append([n[0], n[1] - 1])
if n[1] + 1 < N:
stack.append([n[0], n[1] + 1])
n = 0
for i in range(N):
for j in range(N):
if houses[i][j] == 1 and visited[i][j] == False:
DFS(i, j, n)
n += 1
print(len(blocks))
blocks = sorted(blocks.items(), key=lambda x: x[1])
for i in blocks:
print(i[1])
N = int(input())
houses = [list(map(int, list(input().strip()))) for _ in range(N)]
visited = [list(False for _ in range(N)) for _ in range(N)]
blocks = {}
์ง๋์ ํฌ๊ธฐ N๊ณผ ์ง์ด ์๋์ง ์๋์ง๋ฅผ ๋ํ๋ผ houses๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
๊ณต๋ฐฑ์ด ์๋ ์ ๋ ฅ์ strip()์ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํ์ธํ ๊ณณ์ ํ์ํ visited๋ฅผ houses์ ๋๊ฐ์ ํฌ๊ธฐ๋ก ๋ง๋ ๋ค.
blocks์๋ ๋ช ๋จ์ง์ ๋ช ๊ฐ๊ตฌ๊ฐ ์๋์ง ์ ์ฅํ ๋์ ๋๋ฆฌ์ด๋ค.
def DFS(i, j, number):
stack = [[i, j]]
blocks[number] = 0
while stack:
n = stack.pop()
if houses[n[0]][n[1]] == 1 and visited[n[0]][n[1]] == False:
visited[n[0]][n[1]] = True
blocks[number] += 1
if n[0] - 1 >= 0:
stack.append([n[0] - 1, n[1]])
if n[0] + 1 < N:
stack.append([n[0] + 1, n[1]])
if n[1] - 1 >= 0:
stack.append([n[0], n[1] - 1])
if n[1] + 1 < N:
stack.append([n[0], n[1] + 1])
dfs๋ฅผ ์ด์ฉํ์ฌ ๊ฒ์ฌํ๋ค.
i์ j๋ 2์ฐจ์๋ฐฐ์ด์ ์ธ๋ฑ์ค์ด๊ณ number๋ ๋ช ๋จ์ง์ธ์ง๋ฅผ ์๋ฏธํ๋ค.
number๋ฅผ blocks์ key๋ก ์ ์ฅํ๊ณ value๋ก ์ผ๋จ 0๊ฐ๊ตฌ๋ฅผ ์๋ฏธํ๋ 0์ ๋ฃ๋๋ค.
n์๋ ๊ฐ์ด 2๊ฐ์ธ ๋ฆฌ์คํธ๊ฐ ์ ์ฅ๋๋ฉฐ 2์ฐจ์๋ฆฌ์คํธ์ ์ธ๋ฑ์ค๋ก ์ฐ์ธ๋ค.
์ง์ด ์๊ณ (houses == 1) ๋ฐฉ๋ฌธํ ์ ์์ ๋(visited == False),
visited๋ฅผ True๋ก ๋ฐ๊ฟ ๋ฐฉ๋ฌธํ์์ ํ์ํ๊ณ blocks[number]์ 1์ ๋ํ์ฌ ๊ฐ๊ตฌ๊ฐ ์ถ๊ฐ๋์์์ ํ์ํ๋ค.
if ๋ฌธ์ ์ด์ฉํ์ฌ ์ํ์ข์ฐ ๊ฐ์ด ์ธ๋ฑ์ค๋ฅผ ๋ฒ์ด๋์ง ์๋์ง ํ์ธํ๊ณ , ๋ฒ์ด๋์ง ์์ ๋ stack์ ์ถ๊ฐํ๋ค.
n = 0
for i in range(N):
for j in range(N):
if houses[i][j] == 1 and visited[i][j] == False:
DFS(i, j, n)
n += 1
houses์ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ํ์ธํ๋ฉด์
ํด๋น ์ธ๋ฑ์ค๊ฐ 1์ด๊ณ ๋ฐฉ๋ฌธํ ์ ์ด ์์ ๋ DFS๋ฅผ ํธ์ถํ์ฌ ์๋ก์ด ๋จ์ง n์ ๋ง๋ ๋ค.
print(len(blocks))
blocks = sorted(blocks.items(), key=lambda x: x[1])
for i in blocks:
print(i[1])
๊ฐ ๋จ์ง๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด sorted์ lambdaํจ์๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฌํ๋ค.
'๐์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/pypy3] 9663๋ฒ : N-Queen (0) | 2021.04.12 |
---|---|
[๋ฐฑ์ค/python] 15650๋ฒ : N๊ณผ M (0) | 2021.04.11 |
[๋ฐฑ์ค/python] 2630๋ฒ : ์์ข ์ด ๋ง๋ค๊ธฐ (0) | 2021.04.06 |
[๋ฐฑ์ค/python] 14889๋ฒ : ์คํํธ์ ๋งํฌ (0) | 2021.04.05 |
[๋ฐฑ์ค/python] 1260๋ฒ : DFS์ BFS (0) | 2021.04.05 |