๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๋ฐฑ์ค€(BOJ)

[ ํŒŒ์ด์ฌ(python) ] ๋ฐฑ์ค€ 2667 - ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ

by YWTechIT 2021. 4. 16.
728x90

๐Ÿ“Œ ๋ฐฑ์ค€ 2667 - ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ

๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก ๋‚˜์˜ ํ’€์ด

์•„์นจ๋ถ€ํ„ฐ ์ €๋…๊นŒ์ง€ ์ด ๋ฌธ์ œ๋งŒ ์žก๊ณ  ๋Š˜์–ด์กŒ๋Š”๋ฐ ๋“œ๋””์–ด ํ’€์—ˆ๋‹ค. ๐Ÿ˜‡ ๐Ÿ˜‡ ํŠนํžˆ, ์ฒ˜์Œ์— ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ๋ฅผ 1๋กœ ์„ ์–ธํ•œ ์ด์œ ์™€, ์ƒˆ๋กœ์šด ์ขŒํ‘œ๋ฅผ 1๋กœ ์„ ์–ธํ•œ ์ด์œ ๋ฅผ ์ž˜ ๋ชฐ๋ผ์„œ ์—„์ฒญ ํ—ค๋งธ๋‹ค.

 

์ด ๋ฌธ์ œ๋Š” BFS, DFS ํŒŒํŠธ์— ์•ฝํ•œ ๋‚˜์—๊ฒŒ ๋งŽ์€ ๋„์›€์„ ์ค€ ๋ฌธ์ œ๋‹ค. ๋˜, BFS์™€ DFS๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ง€๊ธˆ์€ BFS๋ฒ„์ „์ด๊ณ  ๋‚ด์ผ์€ DFS๋กœ ํ’€์–ด๋ด์•ผ๊ฒ ๋‹ค.

 

ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ append์™€ flag๋ฐฉ์‹ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ ์„œ ํ’€์—ˆ๋Š”๋ฐ flag ์‹คํ–‰์‹œ๊ฐ„์ด append ๋ณด๋‹ค 4ms์ •๋„ ๋” ๋นจ๋ž๋‹ค.( 4ms๋ฉด ๋ณ„ ์˜๋ฏธ ์—†๋Š” ์‹œ๊ฐ„์ฐจ์ด๊ธด ํ•˜์ง€๋งŒ, True, False๊ฐ€ ๊ทผ์†Œํ•˜๊ฒŒ ๋” ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์ฐธ๊ณ ์ ์œผ๋กœ ์•Œ์•„๋‘์ž!)

 

 

๊ฐœ๋ณ„ ๋‹จ์ง€์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๋Š” ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋Š”๋ฐ, ๊ฒฐ๋ก ์ ์œผ๋กœ {}๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์—ˆ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์ด 2๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ด ๋‹จ์ง€์ˆ˜(bfsํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์กฐ๊ฑด์ด ์ถฉ์กฑ๋œ ํšŸ์ˆ˜, 3๋ฒˆ)
  2. ๊ฐœ๋ณ„ ๋‹จ์ง€์ˆ˜(bfsํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํšŸ์ˆ˜, 7, 8, 9)

 

ํ’€์ด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. N * N์˜ ์ขŒํ‘œ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  2. ๊ทธ๋ ‡๋‹ค๊ณ , ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ํ•จ์ˆ˜์— ๋Œ€์ž…ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์กฐ๊ฑด์— ๋งž๋Š” ์ขŒํ‘œ๋ฅผ ํ™•์ธํ•˜์ž.(ํ˜„์žฌ ๊ฐ’์ด 1์ด๊ณ , ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ผ ๋•Œ)
  3. ํ•„ํ„ฐ๋ง๋œ ๊ฐ’์„ bfsํ•จ์ˆ˜๋กœ ์ง‘์–ด๋„ฃ๋Š”๋‹ค.
  4. deque()์•ˆ์— ์ดˆ๊ธฐ x, y์ขŒํ‘œ๋ฅผ ์ง‘์–ด๋„ฃ๋Š”๋‹ค.(์ด๋•Œ, ๊ด„ํ˜ธ๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•ด์„œ ํŠœํ”Œ ํ˜•ํƒœ๋กœ ๋„ฃ์ž.)
  5. ์ดˆ๊ธฐ ์ขŒํ‘œ๋Š” ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฏ€๋กœ 1๋กœ ๋ฐ”๊พผ๋‹ค.
  6. queue์˜ ๊ฐ’์ด ์—†์–ด์งˆ ๋•Œ๊นŒ์ง€ popleft()๋ฅผ ํ•˜๋Š”๋ฐ ํ˜„์žฌ ์ขŒํ‘œ ๊ธฐ์ค€์œผ๋กœ ์ƒ, ํ•˜, ์ขŒ, ์šฐ์˜ ์ขŒํ‘œ๋ฅผ ํ™•์ธํ•˜๊ณ  1์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ํ์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค.
  7. ์ƒˆ๋กœ์šด ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฏ€๋กœ 1๋กœ ์„ ์–ธํ•˜์ž.
728x90

์กฐ๊ธˆ ๋” ์ž์„ธํ•œ ํ’€์ด ๋ฐฉ๋ฒ•์„ ์ง์ ‘ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ์ž˜ ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด ๋‹ค์Œ ์‚ฌ์ง„์„ ๋ณด์ž (๊ทธ๋ฆผ๊ณผ ๊ธ€์”จ ์ƒํƒœ๋Š” ๋„ˆ๊ทธ๋Ÿฌ์šด ๋งˆ์Œ์œผ๋กœ ์ดํ•ดํ•ด์ฃผ๊ธฐ ๋ฐ”๋ž€๋‹ค.)

 

 

 

# 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()))))

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€