๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/Algorithm

[๋ฐฑ์ค€]2638 - ์น˜์ฆˆ (#ํŒŒ์ด์ฌ #๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ฐจ์ด)

seungineer = seungwoo + engineer 2024. 11. 14. 01:13
‘flag๋ฅผ ์–ด๋””์— ์„ธ์šธ ๊ฒƒ์ธ์ง€’์— ๋”ฐ๋ผ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ N์˜ ์ œ๊ณฑ๋งŒํผ ์ฐจ์ด๊ฐ€ ๋‚ฌ๋‹ค. ํ˜„์žฌ ๋ฌธ์ œ์—์„œ N์€ ์ตœ๋Œ€ 100์ด๋ฏ€๋กœ TLE๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•ˆ ํ•˜๋Š”์ง€ ์ฐจ์ด๋ฅผ ๋‚ด๋Š” ์ค‘์š”ํ•œ ์š”์ธ์ด์—ˆ๋‹ค.
 

2638๋ฒˆ: ์น˜์ฆˆ

 

boj.ma

๋ฌธ์ œ ์š”์•ฝ

์ˆซ์ž 1๋กœ ํ‘œํ˜„๋œ ์น˜์ฆˆ๊ฐ€ ๋ช‡ ๋ฒˆ์˜ ์—ฐ์‚ฐ ํ›„์— ๋ชจ๋‘ ๋…น์„์ง€ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์น˜์ฆˆ(์ˆซ์ž 1)๋Š” ์ฃผ๋ณ€์— ์ˆซ์ž 0์ด 2๊ฐœ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์—ฐ์‚ฐ์—์„œ ๋…น๊ฒŒ ๋œ๋‹ค. ๋‹ค๋งŒ, ์ˆซ์ž 0 ์ค‘ ์น˜์ฆˆ์— ๋‘˜๋Ÿฌ์‹ธ์ธ ๊ฒƒ์€ ์ œ์™ธํ•œ๋‹ค๋Š” ์กฐ๊ฑด์ด ์žˆ์–ด ๋‹ค์†Œ ๊นŒ๋‹ค๋กญ๋‹ค.

1ํŠธ: counting๋˜๋ฉด ์•ˆ ๋˜๋Š” ์˜์—ญ์„ ํ‘œ์‹œํ•œ๋‹ค

์ˆซ์ž 1์ด ๋ชจ๋“  ์ˆซ์ž 0๊ณผ ๋งž๋‹ฟ๋Š” ๊ฒฝ์šฐ๋ฅผ ์„ผ๋‹ค๋ฉด ์‰ฌ์šด ๋ฌธ์ œ์˜€๊ฒ ์ง€๋งŒ, ์ˆซ์ž 1๋กœ ๋งŒ๋“ค์–ด์ง„ ์˜์—ญ ๋‚ด์— ํฌํ•จ๋œ ์ˆซ์ž 0์€ counting ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜์—ฌ ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค.

์ˆซ์ž 1๋กœ ๋งŒ๋“ค์–ด์ง„ ์˜์—ญ ๋‚ด์˜ ์ˆซ์ž 0์„ ์ˆซ์ž 2๋กœ ํ• ๋‹นํ•˜์—ฌ counting ๋˜๋ฉด ์•ˆ ๋˜๋Š” ์˜์—ญ์œผ๋กœ ํ‘œ์‹œํ•˜์˜€๋‹ค. ์ด ์˜์—ญ์„ ํ‘œ์‹œํ•  ๋•Œ๋Š” BFS๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

for i in range(1, N-1):
    for j in range(1, M-1):
        if original_matrix[i][j] == 1: isStop = False
        if original_matrix[i][j] == 0 and vis[i][j] == 0:
            isInside = [True]
            vis[i][j] = 1
            bfs(i, j)
deleteOuter() // ์ฃผ๋ณ€์˜ ์ˆซ์ž 0 ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ ์ˆซ์ž 1 ์ค‘ ์ง€์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ง€์šด๋‹ค
  • ์ˆœํšŒํ•˜๋ฉฐ BFS๋ฅผ ์ ์šฉํ•˜๋Š” ์ฝ”๋“œ
def bfs(i, j):
    qu.append([i, j])
    while qu:
        i, j = qu.popleft()
    
        dx = [1, -1, 0, 0]
        dy = [0, 0, 1, -1]
        
        for k in range(4):
            nx = i + dx[k]
            ny = j + dy[k]
            if 0 <= nx and nx < N and 0 <= ny and ny < M:
                if original_matrix[nx][ny] == 0:
                    qu.append([nx, ny])
                    original_matrix[nx][ny] = 2

BFS๋งŒ ์—ฐ์‚ฐํ•˜๋ฉด ๊ดœ์ฐฎ์•˜๊ฒ ์ง€๋งŒ, BFS๋ฅผ ํ’ˆ๊ณ  ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๋ฐ˜๋ณต๋ฌธ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค. ํ•ด๋‹น ์ˆœํšŒ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” BFS๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ์˜์—ญ์„ ์ˆœํšŒ ์—†์ด ํŠน์ •ํ•˜๊ธฐ ์–ด๋ ค์› ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ๋ชจ๋“  ์ง€์ ์—์„œ BFS๋ฅผ ํ†ตํ•ด ์ˆซ์ž 1 ์˜์—ญ์— ํฌํ•จ๋œ ์ˆซ์ž 0์ธ์ง€ ํŒ๋‹จํ•œ ๊ฒƒ์ด๋‹ค.

์ด ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(NMO(BFS)) = O(NMN*M)์œผ๋กœ N, M ≤ 100์ผ ๋•Œ TLE๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค!

2ํŠธ: counting๋˜์–ด์•ผ ํ•˜๋Š” ์˜์—ญ์„ ํ‘œ์‹œํ•œ๋‹ค

ํ•ญ์ƒ ์ˆซ์ž 0์ธ ์ง€์  (0, 0)๋ถ€ํ„ฐ BFS๋กœ counting ๋˜์–ด์•ผ ํ•˜๋Š” ์˜์—ญ์„ ํ‘œ์‹œํ•œ๋‹ค. ์ด ์˜์—ญ์„ ํ‘œ์‹œํ•  ๋•Œ๋Š” BFS๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

vis = [[0 for _ in range(M)] for _ in range(N)]
vis[0][0] = 1
bfs(0, 0)
deleteOuter()

 

ํ•ญ์ƒ ์ˆซ์ž 0์ธ (0, 0)์ง€์ ์—์„œ BFS๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ ์ˆซ์ž 1๋กœ ๋งŒ๋“ค์–ด์ง„ ์˜์—ญ ๋‚ด์— ํฌํ•จ๋œ ์ˆซ์ž 0์—๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค(์œ„ BFS ํ•จ์ˆ˜ ์ฐธ๊ณ ).

์ด๋ ‡๊ฒŒ BFS๋ฅผ ํ†ตํ•ด counting๋˜์–ด์•ผ ํ•˜๋Š” ์˜์—ญ์— 2๋ฅผ ํ‘œ์‹œํ•ด ๋‘๊ณ , deleteOuter() ํ•จ์ˆ˜์—์„œ ์ˆซ์ž 2์˜ ๊ฐœ์ˆ˜๋ฅผ counting ํ•˜์—ฌ ์‚ญ์ œํ•  ์ˆซ์ž 1์„ ๊ฒฐ์ •ํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(O(BFS)) = O(N*M)์œผ๋กœ N, M ≤ 100์ผ ๋•Œ ์ถฉ๋ถ„ํžˆ ์—ฐ์‚ฐ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์ด๋‹ค.

 

(์ฐธ๊ณ ) ์ˆซ์ž 1์„ ์‚ญ์ œํ•˜๋Š” ์ˆœ๊ฐ„ ๊ฒฐ์ •

‘1ํŠธ’ ๊ฒฝ์šฐ์— ์ˆซ์ž 0์ด ์ฃผ๋ณ€์— ๋ช‡ ๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ countingํ•˜๊ฒŒ ๋œ๋‹ค. Counting ํ›„ ๊ณง๋ฐ”๋กœ ์ˆซ์ž 1์„ 0์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๋‹ค๋ฅธ ์ˆซ์ž 1์˜ ์ฃผ๋ณ€์— ์ˆซ์ž 0์ด ๋ช‡ ๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ counting ํ•  ๋•Œ, ์ง์ „์— ๋ฐ”๊ฟจ๋˜ ๊ฐ’์ด ๋ฐ˜์˜๋œ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ณดํ†ต ๋ฐฉ๋ฌธ ์ด๋ ฅ ํ‘œ์‹œ ๋ณ€์ˆ˜์— ํŠน์ • ๊ฐ’์„ ํ• ๋‹นํ•˜์—ฌ ๋ชจ๋“  ์ˆซ์ž 1์— ๋Œ€ํ•ด counting์„ ๋๋‚ธ ํ›„์—์„œ์•ผ ์ˆซ์ž 1์„ 0์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

‘2ํŠธ’์˜ ๊ฒฝ์šฐ ‘2’์˜ ๊ฐœ์ˆ˜๋ฅผ countingํ•˜์—ฌ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณง๋ฐ”๋กœ ์ˆซ์ž 1์„ 0์œผ๋กœ ๋ฐ”๊พธ์–ด๋„ ๋ฌด๋ฐฉํ•˜์˜€๋‹ค.

 

๐Ÿ’ก ๋งค์šฐ ์œ ์‚ฌํ•œ ์ ‘๊ทผ์ธ๋ฐ ์‹œ๊ฐ„ ๋ณต์žก๋„์—์„œ ์ด๋ ‡๊ฒŒ ํฐ ์ฐจ์ด๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋†€๋ผ์› ๋‹ค.

๐Ÿ“์ฝ”๋“œ ์ „๋ฌธ