๐Ÿค–/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค | Lv3] ํผ์ฆ ์กฐ๊ฐ ์ฑ„์šฐ๊ธฐ (Python)

sssbin 2023. 4. 11. 23:20

 

https://school.programmers.co.kr/learn/courses/30/lessons/84021

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

์ „์ฒด ๋กœ์ง

1. table -> ์ด์–ด์ง„ ํผ์ฆ ์กฐ๊ฐ ๋ถ€๋ถ„๋งŒ ์ž˜๋ผ์„œ ํ–‰๋ ฌ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  board์— ์ถ”๊ฐ€

2. game_board -> ์ด์–ด์ง„ ๋นˆ ๋ถ€๋ถ„๋งŒ ์ž˜๋ผ์„œ ํ–‰๋ ฌ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  rotateํ•˜๋ฉด์„œ ๊ฐ ์ˆ˜ํ–‰๋ฌธ๋งˆ๋‹ค board์— ๊ฐ™์€ ๊ฐ’์ด ์žˆ๋Š”์ง€ ์ฐพ๊ณ  ์ •๋‹ต ์ถ”๊ฐ€

 

bfs(x, y, t, f, array, size)

- ํ์— [x, y]๋ฅผ ๋„ฃ๊ณ  ์ด์–ด์ง„ ๋ถ€๋ถ„์„ ์ฐพ๋Š”๋‹ค.

- table์€ 1์„ ์ฐพ์•„์•ผ ํ•˜๊ณ , game_board๋Š” 0์„ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ t๋ฅผ ๋’€๋‹ค.

- ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ธ๋ฑ์Šค๋Š” f๊ฐ’(table: 0, game_board: 1)์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

- ์ด์–ด์ง„ ๋ถ€๋ถ„์˜ ์ธ๋ฑ์Šค๋“ค์„ ์ €์žฅํ•œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

make_board(array)

- ์ด์–ด์ง„ ๋ถ€๋ถ„์˜ ์ธ๋ฑ์Šค๋“ค์˜ ์ตœ๋Œ“๊ฐ’, ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„ ํ–‰, ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•œ๋‹ค.

- ํ–‰x์—ด์˜ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

- ์ž…๋ ฅ๋ฐ›์€ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ 1๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

- ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

rotate(array)

- ์ž…๋ ฅ๋ฐ›์€ ๋ฐฐ์—ด์„ 90๋„ ํšŒ์ „ํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

# ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 84021: ํผ์ฆ ์กฐ๊ฐ ์ฑ„์šฐ๊ธฐ

from collections import deque

def bfs(x, y, t, f, array, size):
    move = [[1, 0], [-1, 0], [0, 1], [0, -1]]
    temp = []
    queue = deque()
    queue.append([x, y])
    
    while queue:
        x, y = queue.popleft()
        array[x][y] = f
        temp.append([x, y])
        
        for dx, dy in move:
            mx = x + dx
            my = y + dy
            if mx < 0 or mx >= size or my < 0 or my >= size:
                continue
            if array[mx][my] == t:
                queue.append([mx, my])

    return temp

def make_board(array):
    x1 = min(array, key=lambda x:x[0])[0]
    x2 = max(array, key=lambda x:x[0])[0]
    y1 = min(array, key=lambda x:x[1])[1]
    y2 = max(array, key=lambda x:x[1])[1]
    sizeX = x2 - x1 + 1
    sizeY = y2 - y1 + 1
    
    temp = [[0] * sizeY for _ in range(sizeX)]
    for x, y in array:
        temp[x-x1][y-y1] = 1
        
    return temp

def rotate(array):
    r = [list(i) for i in zip(*array[::-1])]
    return r
    
    
def solution(game_board, table):
    size = len(game_board)
    board = [] # ํผ์ฆ ์กฐ๊ฐ๋“ค์„ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ
    
    for i in range(size):
        for j in range(size):
            if table[i][j] == 1:
                # table์—์„œ ์ด์–ด์ง„ ํผ์ฆ ์กฐ๊ฐ์„ ์ฐพ๊ณ ,
                temp = bfs(i, j, 1, 0, table, size)
                # ๊ทธ ๋ถ€๋ถ„๋งŒ ๋–ผ์„œ ์ €์žฅ
                board.append(make_board(temp))
    
    visited = [False] * len(board) # table์˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•  ๋ฆฌ์ŠคํŠธ
    answer = 0
    check = 0 # break๋ฌธ์„ ์œ„ํ•œ ๋ณ€์ˆ˜
    
    for i in range(size):
        for j in range(size):
            if game_board[i][j] == 0:
                # game_board์—์„œ ์ด์–ด์ง„ ๋นˆ ๋ถ€๋ถ„์„ ์ฐพ๊ณ ,
                temp = bfs(i, j, 0, 1, game_board, size)
                # ๊ทธ ๋ถ€๋ถ„๋งŒ ๋–ผ์„œ ๋น„๊ต
                temp = make_board(temp)
                for k in range(4):
                    # ํšŒ์ „
                    temp = rotate(temp)
                    # board๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ
                    for b in range(len(board)):
                        if visited[b]:
                            continue
                        # ๋นˆ ๋ถ€๋ถ„๊ณผ board๊ฐ€ ๊ฐ™์œผ๋ฉด ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ํ›„ ์ •๋‹ต ์ถ”๊ฐ€
                        if temp == board[b]:
                            visited[b] = True
                            for t in temp:
                                answer += t.count(1)
                            check = 1
                            break
                    if check == 1:
                        check = 0
                        break
                    
    return answer

 

์ฐธ,,,, ์ง€์ €๋ถ„ํ•˜๋‹ค,,,