[python] ํ๋ก๊ทธ๋๋จธ์ค - ๋ธ๋ก ๊ฒ์(2019 KAKAO BLIND RECRUITMENT)
๐ค๋ฌธ์  ํด๊ฒฐ
Lv 4 | ์๋ฎฌ๋ ์ด์ ?
๋จผ์  ์ง์ธ ์ ์๋ ๋ธ๋ก๊ณผ ์ง์ธ ์ ์๋ ๋ธ๋ก์ผ๋ก ๋๋ด๋ค. ๋๊ทธ๋ผ๋ฏธ ์น ๋ธ๋ก์ ์ง์ธ ์ ์๋ ๋ธ๋ก

board ์ ๋งจ์ ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋ก ํ์ํ๋ค.
๋ธ๋ก์ ๋ง๋๋ฉด ์์ ๋๊ทธ๋ผ๋ฏธ ์น ๋ธ๋ญ์ธ์ง ํ์ธํ๊ณ ,
๋ง๋ค๋ฉด ์ง์ธ ์ ์๋์ง ํ์ธํ๋ค.
์ง์ธ ์ ์๋ค๋ฉด ์ง์์ฃผ๊ณ , ์ง์ธ ์ ์๋ค๋ฉด( ์ง์ธ ์ ์๋ ๋ธ๋ก์ด๊ธด ํ๋ฐ ์์๊ฐ ๋งํ์ ์์ง ๋ชป์ง์) ์์ ๋ฆฌ์คํธ์ ์ ์ฅ.
๋ค์ ๋ธ๋ก๋ค์ ์ง์ฐ๋ ๊ฒ์ ์ฑ๊ณตํ ๋๋ง๋ค ์์์ ์ฅํ ๋ธ๋ก๋ค๋ ์ง์ธ ์ ์๋์ง ๊ฐ์ด ์ฒดํฌํด์ ์ง์์ค๋ค.
๐จ ๋ฌธ์ ๋ ํฌ๊ฒ ์ด๋ ต์ง ์์ง๋ง, ์ด๋ป๊ฒ๋ ํ ์ ์์ ๊ฒ์ด๋ค. ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๊ฒ ์ง๋ง...

๐ป์์ค ์ฝ๋
blocks = {
    1: [[
        (1, 0),
        (1, 1),
        (1, 2)
    ],
        [(0, 1), (0, 2)]]
    ,
    2: [[
        (1, 0),
        (1, -1),
        (1, -2)
    ],
        [(0, -1), (0, -2)]],
    3: [[
        (1, 0),
        (2, 0),
        (2, 1)
    ],
        [(1, 1)]],
    4: [[
        (1, 0),
        (2, 0),
        (2, -1)
    ],
        [(1, -1)]],
    5: [[
        (1, 0),
        (1, -1),
        (1, 1)
    ],
        [(0, -1), (0, 1)]],
}
def solution(board):
    answer = 0
    n = len(board)
    # ์ง์ธ ์ ์๋ ๋ธ๋ก์ธ์ง ์๋์ง ์ฒดํฌ
    def block_check(x, y, idx):
        for block, d in blocks.items():
            for k in range(3):
                nx = x + d[0][k][0]
                ny = y + d[0][k][1]
                if 0 <= nx < n and 0 <= ny < n:
                    if board[nx][ny] != idx:
                        break
                else:
                    break
            else:
                return block
        else:
            return 0
    # ์ง์ฐ๋ฌ ๋ค์ด๊ฐ๊ธฐ ๋จผ์  ์ฒดํฌ๋ถํฐํ๊ณ 
    def remove_check(x, y, shape, idx):
        nonlocal answer
        for dx, dy in blocks[shape][1]:
            cx = x + dx
            cy = y + dy
            while cx >= 0:
                if board[cx][cy] == 0:
                    cx -= 1
                else:
                    # ๋ชป ์ง์ - ์๊ฐ ๋ค๋ฅธ ๋ธ๋ก์ผ๋ก ๋งํ์์
                    if idx not in temp_list:
                        temp_list.add(idx)
                        temp_dict[idx] = [x, y, shape]
                    return False
        else:
            # ์ง์ธ ์ ์๋ ์กฐ๊ฑด์ ๋ง์กฑํด์ ์ง์ฐ๊ธฐ
            board[x][y] = 0
            for k in range(3):
                board[x + blocks[shape][0][k][0]][y + blocks[shape][0][k][1]] = 0
            answer += 1
            return True
    never_list = set()  # ๋ธ๋ก์ด ์์ ๋ชป์ง์ฐ๋ ํํ
    temp_list = set()  # ์ง์ธ ์ ์๋ ๋ธ๋ญ์ด์ง๋ง ๊ฐ๋ก๋งํ์ ๋ชป์ง์ฐ๊ณ  ์๋ ์ 
    temp_dict = {}  # ๊ทธ ์ ์ ์ด๊ธฐ ์์น
    # ์์!! - ๋ธ๋ก ์ฐพ๊ธฐ
    for i in range(n):
        for j in range(n):
            K = board[i][j]
            if K and K not in never_list and K not in temp_list:
                shape = block_check(i, j, K)
                if shape:  # ๋ด๊ฐ ์ํ๋ ๋ธ๋ก(์ง์ธ ์ ์๋ ๋ธ๋ก) ์ด๋ฉด
                    if remove_check(i, j, shape, K):  # ์ง์ธ ์ ์๋์ง ์ฒดํฌํ๋ฌ ใฑใฑ
                        if temp_list:  # ๋ชป ์ง์ ๋ค ์ ๋ค ๋ค์ ์ง์๋ณผ๊น?
                            for key, value in temp_dict.items():
                                if key in temp_list:
                                    remove_check(value[0], value[1], value[2], key)
                                    temp_list.remove(key)
                else:
                    never_list.add(K)
    return answer
# print(solution([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 4, 0, 0, 0], [0, 0, 0, 0, 0, 4, 4, 0, 0, 0],
#                 [0, 0, 0, 0, 3, 0, 4, 0, 0, 0], [0, 0, 0, 2, 3, 0, 0, 0, 5, 5], [1, 2, 2, 2, 3, 3, 0, 0, 0, 5],
#                 [1, 1, 1, 0, 0, 0, 0, 0, 0, 5]]))
# print(solution([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#                 [4, 0, 7, 0, 0, 0, 0, 0, 0, 0],
#                 [4, 7, 7, 7, 0, 0, 0, 0, 0, 0],
#                 [4, 4, 0, 0, 0, 0, 0, 0, 0, 0],
#                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
#                 [0, 0, 0, 0, 3, 0, 0, 0, 0, 0],
#                 [0, 0, 0, 2, 3, 0, 0, 0, 5, 5],
#                 [1, 2, 2, 2, 3, 3, 0, 0, 0, 5],
#                 [1, 1, 1, 0, 0, 0, 0, 0, 0, 5]]))
๐๋ฌธ์  ํ์ธ
์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค
๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/42894
์ฝ๋ฉํ ์คํธ ์ฐ์ต - ๋ธ๋ก ๊ฒ์
[[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,4,0,0,0],[0,0,0,0,0,4,4,0,0,0],[0,0,0,0,3,0,4,0,0,0],[0,0,0,2,3,0,0,0,5,5],[1,2,2,2,3,3,0,0,0,5],[1,1,1,0,0,0,0,0,0,5]] 2
programmers.co.kr
๋ฌธ์  ์ค๋ช
๋ธ๋ก๊ฒ์
ํ๋ ์ฆ ๋ธ๋ก์ด๋ผ๋ ์ ๊ท ๊ฒ์์ด ์ถ์๋์๊ณ , ์ด๋ง์ด๋งํ ์๊ธ์ด ๊ฑธ๋ฆฐ ์ด๋ฒคํธ ๋ํ๊ฐ ๊ฐ์ต ๋์๋ค.
์ด ๋ํ๋ ์ฌ๋์ ๋์ ํด์ ํ๋ ์ดํ ํ๋ก๊ทธ๋จ์ผ๋ก ์ฐธ๊ฐํด๋ ๋๋ค๋ ๊ท์ ์ด ์์ด์, ๊ฒ์ ์ค๋ ฅ์ด ํํธ์๋ ํ๋ก๋๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด์ ์ฐธ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ฌํ๊ณ ๊ฐ๋ฐ์ ์์ํ์๋ค.
ํ๋ก๋๊ฐ ์ฐ์นํ ์ ์๋๋ก ๋์์ ๋น ๋ฅด๊ณ ์ ํํ ํ๋ก๊ทธ๋จ์ ์์ฑํด ๋ณด์.
๊ฒ์๊ท์น
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด 1ร1 ํฌ๊ธฐ์ ๋ธ๋ก์ ์ด์ด ๋ถ์ฌ ๋ง๋ 3 ์ข ๋ฅ์ ๋ธ๋ก์ ํ์ ํด์ ์ด 12๊ฐ์ง ๋ชจ์์ ๋ธ๋ก์ ๋ง๋ค ์ ์๋ค.

1 x 1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ์ด๋ฃจ์ด์ง N x N ํฌ๊ธฐ์ ๋ณด๋ ์์ ์ด ๋ธ๋ก๋ค์ด ๋ฐฐ์น๋ ์ฑ๋ก ๊ฒ์์ด ์์๋๋ค. (๋ณด๋ ์์ ๋์ธ ๋ธ๋ก์ ํ์ ํ ์ ์๋ค). ๋ชจ๋ ๋ธ๋ก์ ๋ธ๋ก์ ๊ตฌ์ฑํ๋ ์ฌ๊ฐํ๋ค์ด ์ ํํ ๋ณด๋ ์์ ์ฌ๊ฐํ์ ๋ง๋๋ก ๋์ฌ์์ผ๋ฉฐ, ์ ์์ ๊ฑธ์น๊ฑฐ๋ ๋ณด๋๋ฅผ ๋ฒ์ด๋๊ฒ ๋์ฌ์๋ ๊ฒฝ์ฐ๋ ์๋ค.
ํ๋ ์ด์ด๋ ์์ชฝ์์ 1 x 1 ํฌ๊ธฐ์ ๊ฒ์ ๋ธ๋ก์ ๋จ์ด๋จ๋ ค ์์ ์ ์๋ค. ๊ฒ์ ๋ธ๋ก์ ํญ์ ๋งต์ ํ ์นธ์ ๊ฝ ์ฐจ๊ฒ ๋จ์ด๋จ๋ ค์ผ ํ๋ฉฐ, ์ค์ ๊ฑธ์น๋ฉด ์๋๋ค.
์ด๋, ๊ฒ์ ๋ธ๋ก๊ณผ ๊ธฐ์กด์ ๋์ธ ๋ธ๋ก์ ํฉํด ์์ด ๊ฝ ์ฑ์์ง ์ง์ฌ๊ฐํ์ ๋ง๋ค ์ ์๋ค๋ฉด ๊ทธ ๋ธ๋ก์ ์์จ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๊ฒ์ ๋ธ๋ก์ ๋จ์ด๋จ๋ ค ์๋์ ๊ฐ์ด ๋ง๋ค ๊ฒฝ์ฐ ์ฃผํฉ์ ๋ธ๋ก์ ์์จ ์ ์๋ค.

๋นจ๊ฐ ๋ธ๋ก์ ๊ฐ๋ก๋ง๋ ์ฃผํฉ์ ๋ธ๋ก์ด ์์ด์ก์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋นจ๊ฐ ๋ธ๋ก๋ ์์จ ์ ์๋ค.

๊ทธ๋ฌ๋ ๋ค๋ฅธ ๋ธ๋ก๋ค์ ๊ฒ์ ๋ธ๋ก์ ๋จ์ด๋จ๋ ค ์ง์ฌ๊ฐํ์ผ๋ก ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์์จ ์ ์๋ค.
๋ฐ๋ผ์ ์ ์์์์ ์์จ ์ ์๋ ๋ธ๋ก์ ์ต๋ 2๊ฐ์ด๋ค.
๋ณด๋ ์์ ๋์ธ ๋ธ๋ก์ ์ํ๊ฐ ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด board๊ฐ ์ฃผ์ด์ง ๋, ๊ฒ์ ๋ธ๋ก์ ๋จ์ด๋จ๋ ค ์์จ ์ ์๋ ๋ธ๋ก ๊ฐ์์ ์ต๋๊ฐ์ ๊ตฌํ๋ผ.
์ ํ์ฌํญ
- board๋ ๋ธ๋ก์ ์ํ๊ฐ ๋ค์ด์๋ N x N ํฌ๊ธฐ 2์ฐจ์ ๋ฐฐ์ด์ด๋ค.
- N์ 4 ์ด์ 50 ์ดํ๋ค.
 
- board์ ๊ฐ ํ์ ์์๋ 0 ์ด์ 200 ์ดํ์ ์์ฐ์์ด๋ค.
- 0 ์ ๋น ์นธ์ ๋ํ๋ธ๋ค.
- board์ ๋์ฌ์๋ ๊ฐ ๋ธ๋ก์ ์ซ์๋ฅผ ์ด์ฉํด ํํํ๋ค.
- ์๋ชป๋ ๋ธ๋ก ๋ชจ์์ด ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
- ๋ชจ์์ ๊ด๊ณ ์์ด ์๋ก ๋ค๋ฅธ ๋ธ๋ก์ ์๋ก ๋ค๋ฅธ ์ซ์๋ก ํํ๋๋ค.
- ์๋ฅผ ๋ค์ด ๋ฌธ์ ์ ์ฃผ์ด์ง ์์์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋ค.
 

์ ์ถ๋ ฅ ์
| board | result | 
| [[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,4,0,0,0],[0,0,0,0,0,4,4,0,0,0],[0,0,0,0,3,0,4,0,0,0],[0,0,0,2,3,0,0,0,5,5],[1,2,2,2,3,3,0,0,0,5],[1,1,1,0,0,0,0,0,0,5]] | 2 | 
