Algorithm/SWEA

SWEA 홈방범서비스 python (파이썬)

개발자 뭄뭄 2022. 11. 9. 21:02
반응형

단순한 BFS 문제였다.

처음에 생각을 잘못한 부분은 → NxN 에서 가장 큰 마른모는 N일때 발생한다고 생각했는데,

N+1 일때 발생한다는 것이 key 였다. (그것때문에 49/50 개 pass 였다. 😿)

실제로 예시의 사진을 보면, 3x3 배열이 쏙 들어가는건 마름모가 k=4 일때임을 알 수 있다!

앞으로 이런 디테일에 더 주의해서 문제를 풀어야 겠다.

from collections import deque

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]


# BFS 함수를 입력
def BFS(i, j, k):
    global house
    q = deque()
    q.append((i, j))
    cnt = 1
    if homes[i][j] == 1:
        house += 1

    while cnt < k:
        for _ in range(len(q)):
            si, sj = q.popleft()
            for d in range(4):
                ni, nj = si + dx[d], sj + dy[d]
                if 0 <= ni < N and 0 <= nj < N:
                    if visited[ni][nj] == 0:
                        visited[ni][nj] = 1
                        q.append((ni, nj))
                        if homes[ni][nj] == 1:
                            house += 1
        cnt += 1


# 운영비용을 미리 계산한 list를 만들어 둔다.
running = [((k ** 2) + (k - 1) ** 2) for k in range(22)]
# 반복문을 통해서 돌릴 때에는, append 대신 한줄로 간략하게 표현 잊지 말자
T = int(input())

for tc in range(1, T + 1):
    N, M = map(int, input().split())
    homes = [list(map(int, input().split())) for _ in range(N)]

    max_V = 0
    # K = 1부터 돌면서 이익이 나는지 검사한다.
    for k in range(1, N + 2):
        for i in range(N):
            for j in range(N):
                visited = [[0] * N for _ in range(N)]
                visited[i][j] = 1
                house = 0
                BFS(i, j, k)

                rate = house * M
                if rate - running[k] >= 0:
                    max_V = max(house, max_V)
    print(f"#{tc} {max_V}")

Uploaded by N2T

반응형