1. 문제
swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo
2. 접근 방법
시뮬이라 문제에 나온대로 진행하면 된다.
유의해야 할 점은
1. 웜홀이나 블랙홀을 만나지 않는 한 현재 방향을 유지하면서 계속 직진
2. 핀볼이 웜홀에 빠지면 동일한 숫자를 가진 다른 반대편 웜홀로 빠져나옴. 진행 방향 유지
3. 블랙홀 만나면 끝 (return)
4. 처음 위치로 돌아오면 끝(return)
5. 점수 = 벽이나 블록에 부딪힌 횟수 (웜홀 통과는 점수에 반영되지 않는다)
6. 블록, 웜홀, 블랙홀이 있는 위치에서는 시작 불가
7. 처음 출발 위치와 방향은 임의 변경 가능
방향은 상, 하, 좌, 우를 각각 0, 1, 2, 3에 담았따.
그 이유는
블록이 경사면을 만날 경우 수직으로, 수평을 만날 경우 수평으로 방향만 전환되기 때문에 이를 용이하게 접근하고자 했다.
그래서 블록은 현재 방향 대비 아웃풋 방향에 대해 리스트로 만들었고, 해당 리스트는 블록의 type(1, 2, 3, 4, 5)로 접근할 수 있게끔만들고, 웜홀 또한 웜홀의 type(6, 7, 8, 9, 10)에다가 담아서 다른 처리 없이 board에 들어있는 value를 사용해 바로 접근할 수 있게 만들었다.
3. 코드
python
def isBoard(x, y):
if 0 <= x < N and 0 <= y < N:
return True
return False
def game(sx, sy, sd):
score = 0
tx, ty, nd = sx, sy, sd
while True:
tx, ty = tx + dir[nd][0], ty + dir[nd][1]
if isBoard(tx, ty):
# 만약 블록을 만났을 경우
if board[ty][tx] in range(1, 6):
block_type = board[ty][tx]
# 점수 증가
score += 1
nd = block_dir[block_type][nd]
continue
# 만약 웜홀을 만났을 경우
elif board[ty][tx] in range(6, 11):
hall_type = board[ty][tx]
if (tx, ty) == hall[hall_type][0]:
tx, ty = hall[hall_type][1]
else:
tx, ty = hall[hall_type][0]
continue
# 만약 블랙홀을 만났을 경우
elif board[ty][tx] == -1:
return score
# 시작점일 경우
elif (tx, ty) == (sx, sy):
return score
# 만약 그냥 빈 칸인 경우
else:
continue
# 벽을 만났을 경우
else:
nd = (nd+2)%4
score += 1
dir = ((0, -1), (1, 0), (0, 1), (-1, 0)) # 위 오른쪽 아래 왼쪽
block_dir = [[],
[2, 3, 1, 0],
[1, 3, 0, 2],
[3, 2, 0, 1],
[2, 0, 3, 1],
[2, 3, 0, 1]]
T = int(input())
for tc in range(1, T+1):
N = int(input())
board = [list(map(int, input().split())) for _ in range(N)]
maxAns = 0
# 웜홀 리스트
hall = [[] for _ in range(11)]
for y in range(N):
for x in range(N):
val = board[y][x]
if val in range(6, 11):
hall[val].append((x, y))
for y in range(N):
for x in range(N):
if board[y][x] == 0:
for i in range(4):
score = game(x, y, i)
maxAns = max(score, maxAns)
print('#{} {}'.format(tc, maxAns))
4. 마치며
마치며~!
'Algorithm > Python' 카테고리의 다른 글
[백준 11399] ATM (0) | 2021.04.28 |
---|---|
[백준 1932] 정수 삼각형 (6) | 2021.04.27 |
[swea 5656] 벽돌깨기 (0) | 2021.04.23 |
[swea 5658] 보물상자 비밀번호 (0) | 2021.04.23 |
[백준 1655] 가운데를 말해요 (0) | 2021.04.23 |