SWEA 1767 프로세서 연결하기
- 풀이시간: 1시간 34분
- 시간: 8초
- 메모리: 힙, 정적 메모리 합쳐서 256MB 이내, 스택 메모리 1MB 이내
풀이 방법
- 모든 코어를 동, 서, 남, 북 방향에 대해서 연결하면서 최대로 연결할 수 있는 코어의 수 파악
- DFS로 접근. 한 코어가 연결되면 그 다음 코어를 연결하는 방식. -> 재귀로 구현
함수 설계
- solution: 각각의 경우의 수에 대해서 다른 함수들을 추가적으로 실행할 함수. 최대 코어 수 리턴
- core_connect_possible: 코어 연결이 가능한지 파악하는 함수
- core_connection: 코어를 연결하는 함수
- core disconnection: 코어 연결을 해제하는 함수
생각해본 것들.
- 가장자리에 있는 모든 코어는 이미 연결되어 있다고 가정하여 미리 제외 -> 안하면 시간 초과 발생
- 전역 변수로 뺄 수 있는 것들은 그냥 전역변수로 뺄 것...
- DFS의 종료조건 잘 생각하기
- 코어 연결이 불가능할 때, 아니면 일부러 연결하지 않을 때를 고려할 때 for 문 밖으로 빼야함... 그렇지 않으면 모든 포문(동서남북)에서 돌아가게 됨..
느낀점
- DFS 공부 다시 열심히 하자...
- 항상 모든 코드는 설계대로만 하면 잘 될 거라 생각하지만 수정이 필요하다...ㅠㅠ
import sys
sys.stdin = open('1767_input.txt', 'r')
input = sys.stdin.readline
T = int(input())
mat = []
cores = []
N = 0
C = 0
def core_connect_possible(i, j, di, dj):
ni, nj = i, j
while True:
ni += di
nj += dj
if 0<=ni<N and 0<=nj<N:
if mat[ni][nj]:
return False
else:
return True
def core_connection(i, j, di, dj):
ni, nj = i, j
line_len = 0
while True:
ni += di
nj += dj
if 0 <= ni < N and 0 <= nj < N:
mat[ni][nj] = 2
line_len += 1
else:
return line_len
def core_disconnection(i, j, di, dj):
ni, nj = i + di, j + dj
while True:
if 0 <= ni < N and 0 <= nj < N:
mat[ni][nj] = 0
ni += di
nj += dj
else:
return
def solution(checked_core, core, line):
global core_line
if (core_line[0] < core) or (core_line[0] == core and line < core_line[1]):
core_line = [core, line]
if checked_core == C:
return
i, j = cores[checked_core]
for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
if core_connect_possible(i, j, di, dj):
cur_line = core_connection(i, j, di, dj)
solution(checked_core + 1, core + 1, line + cur_line)
core_disconnection(i, j, di, dj)
solution(checked_core + 1, core, line)
for tc in range(1, T+1):
N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
core_line = [0, 0]
cores = []
for i in range(N):
for j in range(N):
if mat[i][j]:
if i == 0 or i == N-1 or j == 0 or j == N-1:
core_line[0] += 1
else:
cores.append((i, j))
C = len(cores)
solution(0, core_line[0], 0)
print(f'#{tc} {core_line[1]}')