일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 위클리 챌린지
- 자바
- backjoon
- divmod
- 이분탐색
- programmers
- 백준
- 파이썬
- dfs
- 정규식
- Re
- 정렬
- lambda
- 다익스트라
- 동적 계획법
- KAKAO BLIND RECRUITMENT
- 카카오
- DateTime
- 수학
- 추석맞이 코딩챌린지
- Zip
- Combinations
- Set
- 그리디
- 재귀함수
- BFS
- 프로그래머스
- heapq
- java
- python
Archives
- Today
- Total
상상쓰
[프로그래머스] 블록 게임 본문
https://programmers.co.kr/learn/courses/30/lessons/42894
열심히 풀었다.
문제에서 제거가 가능한 모양은 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