
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV4suNtaXFEDFAUf
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
풀이 및 해설(주석)
# import sys; sys.stdin = open('input_프로세서.txt', 'r')
D = [[-1, 0], [1, 0], [0, -1], [0, 1]]
# cnt와 length를 리턴해주는 함수
def cnt_length():
# arr을 깊은 복사
tmp = [i[:] for i in arr]
cnt = 0
length = 0
for i in range(Q_len):
# 방향이 없을 때는 continue
if Q_dir[i] < 0:
continue
# 그 방향대로 가다가 1을 만나면 continue
if not check(Q[i][0], Q[i][1], Q_dir[i], tmp):
continue
# 프로세서 연결이 가능한 코어임 코어 + 1
cnt += 1
di = Q[i][0] + D[Q_dir[i]][0]
dj = Q[i][1] + D[Q_dir[i]][1]
# 경계를 벗어 날 때 까지
while 0 <= di < N and 0 <= dj < N:
# 그 방향대로 쭉 1을 이어붙여주고 length를 증가
tmp[di][dj] = 1
length += 1
di += D[Q_dir[i]][0]
dj += D[Q_dir[i]][1]
return cnt, length
def solve(idx):
global max_cnt, min_len
if idx == Q_len:
cnt, length = cnt_length()
if cnt > max_cnt:
max_cnt = cnt
min_len = length
elif cnt == max_cnt:
min_len = min(min_len, length)
return
# flag가 False면 해당 코어는 네 방향 모두 갈 수 다는 뜻
flag = False
for d in range(4):
if check(Q[idx][0], Q[idx][1], d, arr):
flag = True
Q_dir[idx] = d
solve(idx + 1)
if not flag:
Q_dir[idx] = -1
solve(idx + 1)
# 행, 열, 방향을 받고 그 방향대로 쭉 가다가 1을 만나면 Flase를 리턴, 경계를 벗어나면 연결 가능 True를 리턴
def check(i, j, d, arr):
di = i + D[d][0]
dj = j + D[d][1]
while 0 <= di < N and 0 <= dj < N:
if arr[di][dj] == 1:
return False
di += D[d][0]
dj += D[d][1]
return True
for tc in range(int(input())):
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
Q = []
for i in range(1, N - 1):
for j in range(1, N - 1):
if arr[i][j] == 1:
Q.append([i, j])
Q_len = len(Q)
Q_dir = [0] * Q_len
max_cnt = 0
min_len = 9e9
solve(0)
print(f'#{tc+1}', min_len)
후기
- 백트래킹과 재귀에 대해 다시 한번 부족함을 느낀 문제.
- 머릿속으론 이렇게 구하면 되겠다 라고 로직을 생각해냈지만, 구현이 조금 힘들었던 문제이다.
- 초기에 재귀함수에 대해 공부하다 이해가 잘 안가는 부분이 있었는데, 이 문제가 그 케이스이다.
- 열심히 공부하자...
'SWEA' 카테고리의 다른 글
SWEA 2115 벌꿀채취 (파이썬) (0) | 2022.10.06 |
---|---|
SWEA 4008 숫자 만들기 (파이썬) (0) | 2022.09.30 |
SWEA 1952 수영장 (파이썬) (0) | 2022.09.30 |
SWEA 1251 하나로 (파이썬) (1) | 2022.09.30 |
SWEA 1249 보급로 (파이썬) (1) | 2022.09.30 |