상상쓰

[프로그래머스] 블록 게임 본문

Coding Test

[프로그래머스] 블록 게임

상상쓰 2021. 8. 12. 16:45

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

 

열심히 풀었다.

 

문제에서 제거가 가능한 모양은 5가지이다.

 

1) 

1 0 0

1 1 1

 

2)

0 1

0 1

1 1

 

3)

0 0 1

1 1 1

 

4)

1 0

1 0

1 1

 

5)

0 1 0

1 1 1

 

이며 또한, 제거가 가능하게 하려면 위의 보기에서 '0' 에 해당하는 열에서 '1' 위로의 모든 블록은 가장 위에서 떨어지는 검은 블록에 의해서 직사각형이 되어야 제거되므로 '0' 이어야 한다.

 

이 부분을 figureCheck 함수를 만들어 구현하였고, 제거되었다면 제거되는 좌표들을 array 에 담도록 하였다. 제거되었으므로 array 에 있는 좌표를 받아 board[x][y] = 0 으로 한다.

 

처음에는 제거할 수 없었지만, 앞의 블록들이 제거됨으로써 제거가 되는 경우가 있는데 이는 최대 두 단계 이전의 열에서까지만 일어날 수 있는 상황으로 i -= 3 (후에 i = i+1 을 해주기 때문에 2가 아닌 3으로 설정) 하였다. 

 

i 가 N = len(board) 와 같아지면 answer 을 반환한다.

 

def solution(board):
    answer = 0
    N = len(board)
    i = 0
    
    while i < N:
        for j in range(N):
            if board[j][i] != 0:
                array = figureCheck(j,  i,  board)
                
                if array:
                    answer += 1
                    i -= 3
                    
                    for x,  y in array:
                        board[x][y] = 0

        i = i + 1 if i >= 0 else 0
        
    return answer

def figureCheck(x,  y,  board):
    N = len(board)
    v = board[x][y]
    
    if x + 1 < N and y + 2 < N:
        if [board[x+1][y],  board[x+1][y+1],  board[x+1][y+2]] == [v,  v,  v]:
            answer = True
            
            for i in range(x+1):
                if board[i][y+1] != 0 or board[i][y+2] != 0:
                    answer = False
                    break
            
            if answer: return [(x,  y),  (x+1,  y),  (x+1,  y+1),  (x+1,  y+2)]
    
    if x - 2 >= 0 and y + 1 < N:
        if [board[x-2][y+1],  board[x-1][y+1],  board[x][y+1]] == [v,  v,  v]:
            answer = True
            
            for i in range(x):
                if board[i][y] != 0:
                    answer = False
                    break 
            
            if answer: return [(x,  y),  (x-2,  y+1),  (x-1,  y+1),  (x,  y+1)]
    
    if x + 2 < N and y + 1 < N:
        if [board[x+1][y],  board[x+2][y],  board[x+2][y+1]] == [v,  v,  v]:
            answer = True
        
            for i in range(x+2):
                if board[i][y+1] != 0:
                    answer = False
                    break
            
            if answer: return [(x,  y),  (x+1,  y),  (x+2,  y),  (x+2,  y+1)]

    if x - 1 >= 0 and y + 2 < N:
        if [board[x][y+1],  board[x][y+2],  board[x-1][y+2]] == [v,  v,  v]:
            answer = True
            
            for i in range(x):
                if board[i][y] != 0 or board[i][y+1] != 0:
                    answer = False
                    break
            
            if answer: return [(x,  y),  (x,  y+1),  (x,  y+2),  (x-1,  y+2)]
        
        if [board[x][y+1],  board[x-1][y+1],  board[x][y+2]] == [v,  v,  v]:
            answer = True
            
            for i in range(x):
                if board[i][y] != 0 or board[i][y+2] != 0:
                    answer = False
                    break
            
            if answer: return [(x,  y),  (x,  y+1),  (x-1,  y+1),  (x,  y+2)]
    
    return []
        
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]])) # 2

'Coding Test' 카테고리의 다른 글

[백준] 괄호 추가하기  (0) 2021.08.14
[프로그래머스] 최고의 집합  (0) 2021.08.13
[백준] 돌 게임  (0) 2021.08.12
[백준] 평범한 배낭  (0) 2021.08.11
[프로그래머스] 매출 하락 최소화  (0) 2021.08.10
Comments