code review/study
[python code review] 13주차 (빗물, 달이 차오른다 가자, Puyo Puyo)
jmHan
2022. 5. 19. 21:05
반응형
https://www.acmicpc.net/problem/11559
board = [list(input().rstrip()) for _ in range(12)]
moves = [(1,0), (0,1), (-1,0), (0,-1)]
answer = 0
def dfs(x, y, count, color):
global tmp
tmp[x][y] = True
for dx, dy in moves:
nx = dx + x
ny = dy + y
if 0 <= nx < 12 and 0 <= ny < 6:
if not tmp[nx][ny] and board[nx][ny] == color:
count += dfs(nx, ny, count+1, color)
return count
def drop():
global board, visited
for i in range(12):
for j in range(6):
if visited[i][j]:
board[i][j] = '.'
for j in range(6):
flag = True
for i in range(12):
if not flag and board[i][j] == '.':
for k in range(i, 0, -1):
board[k][j] = board[k - 1][j]
board[0][j] = '.'
if board[i][j] != '.':
flag = False
while True:
finish = True
visited = [[False] * 6 for _ in range(12)]
for i in range(12):
for j in range(6):
if board[i][j] != '.':
tmp = [visited[i][:] for i in range(12)]
if dfs(i, j, 0, board[i][j]) >= 4:
finish = False
visited = tmp
if finish:
break
drop()
answer += 1
print(answer)
https://www.acmicpc.net/problem/14719
아이디어까지 접근하지 못했고 다른 블로그에서 힌트를 얻어 구현했다.
아이디어 : 현재 위치에서의 빗물 구하기
(1) 빗물 높이를 담은 리스트 height에 순서대로 접근
(2) 현재 위치(now = height[i])에서 왼쪽으로 가장 높은 위치의 빗물 양 구하기 maxLH
(3) 현재 위치에서 오른쪽으로 가장 높은 위치의 빗물 양 구하기 maxRH
(4) 둘 중 낮은 높이 구하기 minH
(5) 현재 위치에 해당하는 빗물 양 구하기 water = minH - now (단, 현재 위치보다 minH가 높을 경우)
[구현]
n, m = map(int, input().split())
height = list(map(int, input().split()))
answer = 0
for i in range(1, m):
now = height[i]
maxLH, maxRH = 0, 0
# 왼쪽 최대 높이
for j in range(i-1, -1, -1):
maxLH = max(maxLH, height[j])
# 오른쪽 최대 높이
for k in range(i+1, m):
maxRH = max(maxRH, height[k])
# 둘 중 낮은 높이 - 현재 위치의 높이 = 현재 위치에서의 빗물
minH = min(maxLH, maxRH)
water = minH - now if now < minH else 0
answer += water
print(answer)
https://www.acmicpc.net/problem/1194
ㅇㅇㅇ
반응형