-
[Python] ๋ฐฑ์ค 2667 ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (BFS)๐ป Algorithm/Python 2022. 7. 2. 15:47
๐ ๋ฌธ์
<๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ ์ฌ๊ฐํ ๋ชจ์์ ์ง๋๊ฐ ์๋ค. 1์ ์ง์ด ์๋ ๊ณณ์, 0์ ์ง์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ์ฒ ์๋ ์ด ์ง๋๋ฅผ ๊ฐ์ง๊ณ ์ฐ๊ฒฐ๋ ์ง์ ๋ชจ์์ธ ๋จ์ง๋ฅผ ์ ์ํ๊ณ , ๋จ์ง์ ๋ฒํธ๋ฅผ ๋ถ์ด๋ ค ํ๋ค. ์ฌ๊ธฐ์ ์ฐ๊ฒฐ๋์๋ค๋ ๊ฒ์ ์ด๋ค ์ง์ด ์ข์ฐ, ํน์ ์๋์๋ก ๋ค๋ฅธ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ๋๊ฐ์ ์์ ์ง์ด ์๋ ๊ฒฝ์ฐ๋ ์ฐ๊ฒฐ๋ ๊ฒ์ด ์๋๋ค. <๊ทธ๋ฆผ 2>๋ <๊ทธ๋ฆผ 1>์ ๋จ์ง๋ณ๋ก ๋ฒํธ๋ฅผ ๋ถ์ธ ๊ฒ์ด๋ค. ์ง๋๋ฅผ ์ ๋ ฅํ์ฌ ๋จ์ง์๋ฅผ ์ถ๋ ฅํ๊ณ , ๊ฐ ๋จ์ง์ ์ํ๋ ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ง๋์ ํฌ๊ธฐ N(์ ์ฌ๊ฐํ์ด๋ฏ๋ก ๊ฐ๋ก์ ์ธ๋ก์ ํฌ๊ธฐ๋ ๊ฐ์ผ๋ฉฐ 5≤N≤25)์ด ์ ๋ ฅ๋๊ณ , ๊ทธ ๋ค์ N์ค์๋ ๊ฐ๊ฐ N๊ฐ์ ์๋ฃ(0ํน์ 1)๊ฐ ์ ๋ ฅ๋๋ค.
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ด ๋จ์ง์๋ฅผ ์ถ๋ ฅํ์์ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋จ์ง๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ์์ค.
์์ ์ ๋ ฅ 1
7
0110100
0110101
1110101
0000111
0100000
0111110
0111000์์ ์ถ๋ ฅ 1
3
7
8
9
๐ ํ์ด
๐ฌ Code
import sys from collections import deque input = sys.stdin.readline def bfs(x, y): q = deque([(x, y)]) cnt = 1 while q: x, y = q.popleft() visited[x][y] = 1 for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny] and town[nx][ny] == 1: town[nx][ny] += 1 q.append((nx, ny)) cnt += 1 count.append(cnt) if __name__ == '__main__': n = int(input()) town = [] for _ in range(n): town.append(list(map(int, input().rstrip()))) dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] visited = [[0 for _ in range(n)] for _ in range(n)] count = [] for i in range(n): for j in range(n): if not visited[i][j] and town[i][j] == 1: bfs(i, j) count.sort() print(len(count), *count, sep='\n')
๐ก Solution
- town: ์ง์ด ์๋ ๊ณณ๊ณผ ์๋ ๊ณณ์ ํํํ ์ง๋
- dx, dy: ๋ฐฉํฅ๋ฒกํฐ (์, ํ, ์ข, ์ฐ)
- visited: ํด๋น ์ขํ๋ฅผ ๋ฐฉ๋ฌธํ๋์ง ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ๋ 2์ฐจ์ ๋ฐฐ์ด
- count: ๊ฐ ๋จ์ง์ ๊ฐ๊ตฌ ์๋ฅผ ๋ด์๋๋ ๋ฐฐ์ด
for i in range(n): for j in range(n): if not visited[i][j] and town[i][j] == 1: bfs(i, j)
์ ์ฝ๋์์ ๋ณผ ์ ์๋ฏ (0, 0)๋ถํฐ ์ขํ๋ฅผ ์ฒดํฌํฉ๋๋ค. ํด๋น ์ขํ์ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๊ณ ์ง์ด ์๋ค๋ฉด bfs(0, 0)์ ํธ์ถํฉ๋๋ค.
def bfs(x, y): q = deque([(x, y)]) cnt = 1 while q: x, y = q.popleft() visited[x][y] = 1 for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny] and town[nx][ny] == 1: town[nx][ny] += 1 q.append((nx, ny)) cnt += 1 count.append(cnt)
(0, 0)์ผ๋ก๋ถํฐ ์ํ์ข์ฐ๋ก ์ด๋ํ ํ์ ์ขํ๋ฅผ ์ฒดํฌํ๊ธฐ ์ํด for๋ฌธ์ 4๋ฒ ๋๋ฆฝ๋๋ค. ์ด๋ ํ ์ขํ๊ฐ ์ขํ๋ฒ์๋ฅผ ๋์ง ์๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์๊ณ , ์ง์ด ์๋ค๋ฉด ํ์ ๋ฃ์ต๋๋ค. ์ฐ๊ฒฐ๋ ํ ๊ฐ๊ตฌ๋ฅผ ์ฐพ์์ผ๋ฏ๋ก cnt๋ฅผ 1 ์ฆ๊ฐ์ํต๋๋ค.
'๐ป Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๋ฐฑ์ค 11286 ์ ๋๊ฐ ํ (Heapq) (0) 2022.07.08 [Python] ๋ฐฑ์ค 3184 ์ (BFS) (0) 2022.07.02 [Python] ๋ฐฑ์ค 2615 ์ค๋ชฉ (Brute Force) (0) 2022.07.02 [Python] ๋ฐฑ์ค 1913 ๋ฌํฝ์ด (๊ตฌํ) (0) 2022.07.02 [Python] ๋ฐฑ์ค 2178 ๋ฏธ๋ก ํ์ (BFS) (0) 2022.07.02