Baek_21609

원성혁·2022년 11월 3일
0

algorithm

목록 보기
13/21
post-thumbnail

이 문제도 삼전코테 준비중에 풀었던 문제이다.

from collections import deque
import sys
input = sys.stdin.readline

N, M = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(N)]
score = 0
group = list()


def find_group(x, y):
    dq = deque([(x, y)])
    vis = {(x, y)}
    num = matrix[x][y]
    rainbow = 0
    global group
    while dq:
        a, b = dq.popleft()
        for n, m in [[1, 0], [0, 1], [-1, 0], [0, -1]]:
            an, bm = a+n, b+m
            if 0 <= an < N and 0 <= bm < N and (an, bm) not in vis and (matrix[an][bm] == 0 or matrix[an][bm] == num):
                dq.append((an, bm))
                vis.add((an, bm))
                if matrix[an][bm] == 0:
                    rainbow += 1
    if len(vis) > 1:
        group.append((len(vis), rainbow, (x, y), vis))
    return vis


def destroy_group(group):
    for i, j in group:
        matrix[i][j] = ''


def gravity():
    for i in range(N-1, -1, -1):
        for j in range(N):
            if matrix[i][j] == '':
                k = i
                while k >= 0:
                    if matrix[k][j] == '':
                        k -= 1
                    elif matrix[k][j] >= 0:
                        matrix[i][j] = matrix[k][j]
                        matrix[k][j] = ''
                        break
                    else:
                        break


def turn_matrix():
    global matrix
    new_matrix = [[0]*N for _ in range(N)]
    for i in range(N):
        for j in range(N):
            new_matrix[i][j] = matrix[j][N-i-1]
    matrix = new_matrix


def solve():
    global group
    global score
    visit = set()
    while True:
        for i in range(N):
            for j in range(N):
                if matrix[i][j] != '' and matrix[i][j] > 0 and (i, j) not in visit:
                    v = find_group(i, j)
                    visit.update(v)
        if not group:
            break
        group.sort()
        gr = group.pop()
        destroy_group(gr[3])
        score += gr[0]**2
        gravity()
        turn_matrix()
        gravity()
        group = list()
        visit = set()
    print(score)

삼전 문제를 준비하며 필요 함수들을 만들고 차근차근 실행하는 습관이 키워졌다ㅋㅋ
1. 블로 그룹 찾고 제거, 점수 누적
2. 중력작용
3. 반시계 방향 회전
4. 중력작용

그래프이론이 필요한 문제고 난 요즘 항상 bfs를 애용한다.
문제는 다행히 잘 맞췄다.
차근차근이 핵심인 것 같다.

profile
AI개발자를 향해 전진중

0개의 댓글