20061. 모노미노도미노 2 문제 바로가기
해결 방법
다음 체크한 부분을 각각 green_board, blue_board로 두었다! 근데 blue_board를 4X6이 아닌 green_board 처럼 6X4로 설정하였다!! 시계방향으로 90도 회전하고 좌우반전했다고 보고 블록이 들어가도록 설정했습니다!
- green_board : x 좌표에 의해 위치가 결정된다.
- blue_board : y 좌표에 의해 위치가 결정된다
주요 과정 설명
블록 입력받기
greenBlock 호출!
- 블록 1, 2, 3 타입별로 if 절을 나눠서 블록 채우기
- checkBlock 함수를 통해 각 행별로 칸이 다 채워있으면 지울 수 있도록 동작하기
- 특별한 칸 확인하며 값이 있으면 뒤로 행 미루기
blueBlock 호출!
greenBlock과 과정 동일~
- 블록 1, 2, 3 타입별로 if 절을 나눠서 블록 채우기
- checkBlock 함수를 통해 각 행별로 칸이 다 채워있으면 지울 수 있도록 동작하기
- 특별한 칸 확인하며 값이 있으면 뒤로 행 미루기
다음 과정을 블록 입력만큼 반복 후 결과 출력하기
★ 왜 계속 틀렸습니다
를 받았던 이유!!
특별한 칸에 숫자가 있는 경우 코드를 잘 못짜서!
for문을 하게 되면 연속 특별한 두 칸이 차있는 경우 1번행만 사라진다..!!!!!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# before : 잘못된 코드
for b in range(1, -1, -1):
if sum(blue_board[b]) != 0:
blue_board.pop()
blue_board.insert(0, [0] * 4)
# after : 패스한 코드
if sum(blue_board[0]) != 0:
blue_board.pop()
blue_board.insert(0, [0] * 4)
if sum(blue_board[1]) != 0:
blue_board.pop()
blue_board.insert(0, [0] * 4)
구현한 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
def checkBlock(color): # 4행 칸이 모두 타일로 찾는지 확인하는 함수
global score
if color == "green":
board = green_board
else:
board = blue_board
idx = 5
while idx >= 0:
if sum(board[idx]) == 4: # 칸이 다 차있을 때 지우고 이동하기
board.pop(idx)
board.insert(0, [0] * 4)
score += 1
else:
idx -= 1
def greenBlock(t, x): # 초록색 판에서 일어나는 과정 함수
# 1. 초록색 판에 블록 넣기
if t == 1: # 블록이 1번 타입인 경우
for g in range(1, 6):
if green_board[g][x] != 0:
green_board[g - 1][x] = 1
break
if g == 5:
# 다른 블록을 만난 적없기에 끝에 위치하기
green_board[g][x] = 1
elif t == 2: # 블록이 2번 타입인 경우
for g in range(1, 6):
if green_board[g][x] != 0 or green_board[g][x + 1] != 0:
green_board[g - 1][x] = 1
green_board[g - 1][x + 1] = 1
break
if g == 5:
green_board[g][x] = 1
green_board[g][x + 1] = 1
else: # t == 3 | 블록이 1번 타입인 경우
for g in range(1, 5):
if green_board[g][x] != 0 or green_board[g + 1][x] != 0:
green_board[g - 1][x] = 1
green_board[g][x] = 1
break
if g == 4:
green_board[g][x] = 1
green_board[g + 1][x] = 1
# 2. 각 행별 모든 칸이 차있는지 확인하기
checkBlock("green")
# 3. 특별한 칸(연한색) 확인하기
if sum(green_board[0]) != 0:
green_board.pop()
green_board.insert(0, [0] * 4)
if sum(green_board[1]) != 0:
green_board.pop()
green_board.insert(0, [0] * 4)
def blueBlock(t, y): # 파란색 판에서 일어나는 과정 함수
# 1. 파란색 판에 블록 넣기
if t == 1:
for b in range(1, 6):
if blue_board[b][y] != 0:
blue_board[b - 1][y] = 1
break
if b == 5:
blue_board[b][y] = 1
elif t == 2:
for b in range(1, 5):
if blue_board[b][y] != 0 or blue_board[b + 1][y] != 0:
blue_board[b - 1][y] = 1
blue_board[b][y] = 1
break
if b == 4:
blue_board[b][y] = 1
blue_board[b + 1][y] = 1
else: # t == 3 | 블록이 1번 타입인 경우
for b in range(1, 6):
if blue_board[b][y] != 0 or blue_board[b][y + 1] != 0:
blue_board[b - 1][y] = 1
blue_board[b - 1][y + 1] = 1
break
if b == 5:
blue_board[b][y] = 1
blue_board[b][y + 1] = 1
# 2. 각 행별 모든 칸이 차있는지 확인하기
checkBlock("blue")
# 3. 특별한 칸(연한색) 확인하기
if sum(blue_board[0]) != 0:
blue_board.pop()
blue_board.insert(0, [0] * 4)
if sum(blue_board[1]) != 0:
blue_board.pop()
blue_board.insert(0, [0] * 4)
green_board = [[0] * 4 for _ in range(6)] # 초록색 보드
blue_board = [[0] * 4 for _ in range(6)] # 파란색 보드
score = 0 # 행이 사라져 점수가 획득을 저장할 변수
N = int(input())
for _ in range(N):
t, y, x = list(map(int, input().split())) # 블록 입력받기
greenBlock(t, x)
blueBlock(t, y)
# 최종적으로 결과값 출력하기
print(score)
left_block = 0
for b in range(6):
left_block += sum(green_board[b])
left_block += sum(blue_board[b])
print(left_block)