KEEP GOING

[python code review] 13주차 (빗물, 달이 차오른다 가자, Puyo Puyo) 본문

code review/study

[python code review] 13주차 (빗물, 달이 차오른다 가자, Puyo Puyo)

jmHan 2022. 5. 19. 21:05
반응형

https://www.acmicpc.net/problem/11559

 

11559번: Puyo Puyo

총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.

www.acmicpc.net

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

 

14719번: 빗물

첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치

www.acmicpc.net

아이디어까지 접근하지 못했고 다른 블로그에서 힌트를 얻어 구현했다.

아이디어 : 현재 위치에서의 빗물 구하기

 

(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

 

1194번: 달이 차오른다, 가자.

첫째 줄에 미로의 세로 크기 N과 가로 크기 M이 주어진다. (1 ≤ N, M ≤ 50) 둘째 줄부터 N개의 줄에 미로의 모양이 주어진다. 같은 타입의 열쇠가 여러 개 있을 수 있고, 문도 마찬가지이다. 그리고,

www.acmicpc.net

ㅇㅇㅇ​
반응형
Comments