진행 방향을 꺾어주는것이 포인트인 문제이다. 반대로 돌아가는 경우, 왼쪽으로 꺾는 경우, 오른쪽으로 꺾는 경우가 존재하며, 각 블록은 들어오는 방향에따라 꺾이는 방향이 달라진다. 이를 코드 상단에 보이는 것과 같이 딕셔너리로 표현 가능하며, 핀볼이 이동하는 것은 재귀 함수로도 구현이 가능하나, depth error가 발생하기 때문에 반복문으로 나타내야 한다. 간단하지만 상당히 재밌는 문제라고 생각한다.
# 북 서 남 동
dRow = [-1,0,1,0]
dCol = [0,-1,0,1]
# 북 서 남 동
# 0:back 1:right 2:left
blocks = {
1 : [0,1,2,0],
2 : [1,2,0,0],
3 : [2,0,0,1],
4 : [0,0,1,2],
5 : [0,0,0,0]
}
def get_new_direction(block_idx,direction):
if blocks[block_idx][direction] == 0:
return direction - 2 if direction >= 2 else direction + 2
elif blocks[block_idx][direction] == 1:
return direction - 1 if direction > 0 else 3
elif blocks[block_idx][direction] == 2:
return direction + 1 if direction < 3 else 0
def pinball(loc,d,point):
global answer
_row,_col = loc
while True:
_row += dRow[d]
_col += dCol[d]
if (_row,_col) == start or board[_row][_col] == -1:
answer = max(answer,point)
break
elif 1 <= board[_row][_col] <= 5:
d = get_new_direction(board[_row][_col], d)
point += 1
elif 6 <= board[_row][_col] <= 10:
_row,_col = (wormholes[board[_row][_col]] - {(_row,_col)}).pop()
T = int(input())
for t in range(1,T+1):
N = int(input())
wormholes = dict()
board = [[5]*(N+2)]
for row in range(N):
li = [5]
for col,v in enumerate(map(int,input().split())):
li.append(v)
if 6 <= v <= 10:
if not wormholes.get(v):
wormholes[v] = set()
wormholes[v].add((row+1,col+1))
li.append(5)
board.append(li)
board.append([5]*(N+2))
answer = 0
for row in range(1,N+1):
for col in range(1,N+1):
start = (row,col)
if board[row][col] == 0:
for i in range(4):
pinball(start,i,0)
print(f'#{t} {answer}')
'PS > SWEA' 카테고리의 다른 글
1767. [SW Test 샘플문제] 프로세서 연결하기 (0) | 2022.08.18 |
---|