๐ ๋ฐฑ์ค 2667 - ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ
๐ก ๋์ ํ์ด
์์นจ๋ถํฐ ์ ๋ ๊น์ง ์ด ๋ฌธ์ ๋ง ์ก๊ณ ๋์ด์ก๋๋ฐ ๋๋์ด ํ์๋ค. ๐ ๐ ํนํ, ์ฒ์์ ๋ฐฉ๋ฌธํ ์ขํ๋ฅผ 1๋ก ์ ์ธํ ์ด์ ์, ์๋ก์ด ์ขํ๋ฅผ 1๋ก ์ ์ธํ ์ด์ ๋ฅผ ์ ๋ชฐ๋ผ์ ์์ฒญ ํค๋งธ๋ค.
์ด ๋ฌธ์ ๋ BFS, DFS
ํํธ์ ์ฝํ ๋์๊ฒ ๋ง์ ๋์์ ์ค ๋ฌธ์ ๋ค. ๋, BFS
์ DFS
๋ก ํ ์ ์๋๋ฐ ์ง๊ธ์ BFS
๋ฒ์ ์ด๊ณ ๋ด์ผ์ DFS
๋ก ํ์ด๋ด์ผ๊ฒ ๋ค.
ํธ๋ ๋ฐฉ๋ฒ์ผ๋ก append
์ flag
๋ฐฉ์ ๋ ๊ฐ๋ก ๋๋ ์ ํ์๋๋ฐ flag
์คํ์๊ฐ์ด append
๋ณด๋ค 4ms
์ ๋ ๋ ๋นจ๋๋ค.( 4ms๋ฉด ๋ณ ์๋ฏธ ์๋ ์๊ฐ์ฐจ์ด๊ธด ํ์ง๋ง, True, False
๊ฐ ๊ทผ์ํ๊ฒ ๋ ๋น ๋ฅด๋ค๋ ๊ฒ์ ์ฐธ๊ณ ์ ์ผ๋ก ์์๋์!)
๊ฐ๋ณ ๋จ์ง์๋ฅผ ๊ตฌํ๋ ์ฝ๋๋ ๊ณ ๋ฏผ์ ๋ง์ด ํ๋๋ฐ, ๊ฒฐ๋ก ์ ์ผ๋ก {}
๋ฅผ ์ด์ฉํด์ ํ์๋ค.
์ด ๋ฌธ์ ์์ ๊ตฌํํด์ผ ํ๋ ๊ธฐ๋ฅ์ ์ด 2๊ฐ์ง๋ก ๋๋๋๋ฐ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ด ๋จ์ง์(bfsํจ์๋ฅผ ์คํํ๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ํ์, 3๋ฒ)
- ๊ฐ๋ณ ๋จ์ง์(bfsํจ์๋ฅผ ์คํํ๋ ํ์, 7, 8, 9)
ํ์ด ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
N * N
์ ์ขํ๋ฅผ ๋ชจ๋ ํ์ธํด์ผ ํ๋ฏ๋ก ์ด์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ค.- ๊ทธ๋ ๋ค๊ณ , ๋ชจ๋ ์ขํ๋ฅผ ํจ์์ ๋์ ํ๋ ๊ฒ์ด ์๋ ์กฐ๊ฑด์ ๋ง๋ ์ขํ๋ฅผ ํ์ธํ์.(ํ์ฌ ๊ฐ์ด 1์ด๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ผ ๋)
- ํํฐ๋ง๋ ๊ฐ์
bfs
ํจ์๋ก ์ง์ด๋ฃ๋๋ค. deque()
์์ ์ด๊ธฐx, y
์ขํ๋ฅผ ์ง์ด๋ฃ๋๋ค.(์ด๋, ๊ดํธ๋ฅผ ํ๋ ๋ ์ถ๊ฐํด์ ํํ ํํ๋ก ๋ฃ์.)- ์ด๊ธฐ ์ขํ๋ ๋ฐฉ๋ฌธํ์ผ๋ฏ๋ก 1๋ก ๋ฐ๊พผ๋ค.
queue
์ ๊ฐ์ด ์์ด์ง ๋๊น์งpopleft()
๋ฅผ ํ๋๋ฐ ํ์ฌ ์ขํ ๊ธฐ์ค์ผ๋ก ์, ํ, ์ข, ์ฐ์ ์ขํ๋ฅผ ํ์ธํ๊ณ 1์ด ๋ฐ๊ฒฌ๋๋ฉด ํด๋น ์ขํ๋ฅผ ํ์ ์ง์ด๋ฃ๋๋ค.- ์๋ก์ด ์ขํ๋ฅผ ๋ฐฉ๋ฌธํ์ผ๋ฏ๋ก 1๋ก ์ ์ธํ์.
์กฐ๊ธ ๋ ์์ธํ ํ์ด ๋ฐฉ๋ฒ์ ์ง์ ์์ฑํ๋๋ฐ ์ ๋ชจ๋ฅด๊ฒ ์ผ๋ฉด ๋ค์ ์ฌ์ง์ ๋ณด์ (๊ทธ๋ฆผ๊ณผ ๊ธ์จ ์ํ๋ ๋๊ทธ๋ฌ์ด ๋ง์์ผ๋ก ์ดํดํด์ฃผ๊ธฐ ๋ฐ๋๋ค.)
# number ํ์ธ
from collections import deque
def bfs(x, y, cnt):
queue = deque()
queue.append((x, y))
visited[x][y] = 1
while queue:
x, y = queue.popleft()
for i in range(4): # Search Up, Down, Left, Right
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < N and 0 <= ny < N: # private out of bound
if graph[nx][ny] == 1 and visited[nx][ny] == 0: # check current value is house and not visited house
queue.append((nx, ny))
visited[nx][ny] = 1
cnt_dict[cnt] += 1
dx = [-1, 1, 0, 0] # init Up and Down
dy = [0, 0, -1, 1] # init Left and Right
N = int(input()) # map_size
graph = [list(map(int, input())) for _ in range(N)] # input init
visited = [[0] * N for _ in range(N)] # visited init
cnt = 0 # count all complex number
cnt_dict = {} # count each complex number
for i in range(N):
for j in range(N):
if graph[i][j] == 1 and visited[i][j] == 0:
cnt+=1
cnt_dict[cnt] = 1
bfs(i, j, cnt)
print(cnt)
print(visited)
print('\n'.join(map(str, sorted(cnt_dict.values()))))
# True, False ๋ฐฉ๋ฒ
from collections import deque
def bfs(x, y, cnt):
queue = deque()
queue.append((x, y))
visited[x][y] = True
while queue:
x, y = queue.popleft()
for i in range(4): # Search Up, Down, Left, Right
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < N and 0 <= ny < N: # private out of bound
if graph[nx][ny] == 1 and visited[nx][ny] == False: # check current value is house and not visited house
queue.append((nx, ny))
visited[nx][ny] = True
cnt_dict[cnt] += 1
dx = [-1, 1, 0, 0] # init Up and Down
dy = [0, 0, -1, 1] # init Left and Right
N = int(input()) # map_size
graph = [list(map(int, input())) for _ in range(N)] # input init
visited = [[False] * N for _ in range(N)] # visited init
cnt = 0 # count all complex number
cnt_dict = {} # count each complex number
for i in range(N):
for j in range(N):
if graph[i][j] == 1 and visited[i][j] == False:
cnt+=1
cnt_dict[cnt] = 1
bfs(i, j, cnt)
print(cnt)
print('\n'.join(map(str, sorted(cnt_dict.values()))))
'Algorithm > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 2468 - ์์ ์์ญ (0) | 2021.04.19 |
---|---|
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 2331 - ๋ฐ๋ณต์์ด (0) | 2021.04.17 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 1260 - DFS์ BFS (0) | 2021.04.16 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 13458 - ์ํ๊ฐ๋ (0) | 2021.04.14 |
[python] ๋ฐฑ์ค 2445 - ๋ณ ์ฐ๊ธฐ 8 (2) | 2021.04.05 |
๋๊ธ