Algorithm Problem/Python

[python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋ธ”๋ก ๊ฒŒ์ž„(2019 KAKAO BLIND RECRUITMENT)

deo2kim 2020. 9. 11. 20:58
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

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

 

๋ฐ˜์‘ํ˜•