728x90
반응형
문제링크
https://www.codetree.ai/missions/2/problems/pinball-game?&utm_source=clipboard&utm_medium=text
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
1. 핵심
- / 과 \ 부딪혔을 때 방향전환 다루기
- 회전을 할 때는 동(0) 남(1) 서(2) 북(3)을 기본으로 한다.
- 1번(/): 0 ↔ 3, 1 ↔ 2
- 2번(\): 2 ↔ 3, 0 ↔ 1
def change_dir(r, c, d):
if board[r][c] == 1:
d = 3 - d
elif board[r][c] == 2:
if d == 2 or d == 0:
d += 1
else:
d -= 1
return d
- 시작이 될 수 있는 것들의 좌표의 모음 - check - 방향 잘 고려하기
- t = 2로 초기화 - 들어오고 나가는 시간도 세야하므로 2초가 기본이다.
2. 코드(Python)
n = int(input())
board = [list(map(int, input().split())) for _ in range(n)]
# 격자 안에서 단일 객체의 이동 + 시계 & 반시계 90도 회전이 있는 문제!
# 회전 - 동(0) 남(1) 서(2) 북(3)
# 반시계 - 시계가 정확하게 나뉘어지는게 아님!!
# /: 동(0) -> 북(3)-반시계|| 북(3) -> 동(0)-시계
# /: 남(1) -> 서(2)-시계 || 사(2) -> 남(1)-반시계
# \: 동(0) -> 남(1)-시계 || 남(1) -> 동(0)-반시계
# 1번 0<->3 1<->2
# 2번 2<->3 0<->1
def change_dir(r, c, d):
if board[r][c] == 1:
d = 3 - d
elif board[r][c] == 2:
if d == 2 or d == 0:
d += 1
else:
d -= 1
return d
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
def in_range(r, c):
return 0 <= r < n and 0 <= c < n
# 1초동안 움직임을 의미하는 함수
def simulate(r, c, d):
d = change_dir(r, c, d)
nr = r + dr[d]
nc = c + dc[d]
return nr, nc, d
check = []
for i in range(n):
check.append((0, i, 1))
check.append((n - 1, i, 3))
check.append((i, 0, 0))
check.append((i, n - 1, 2))
max_ans = 0
for r, c, d in check:
t = 2
while True:
r, c, d = simulate(r, c, d)
if not in_range(r, c):
break
else:
t += 1
max_ans = max(max_ans, t)
728x90
반응형
'PS > 코드트리' 카테고리의 다른 글
[BFS] 가중치가 동일한 그래프에서의 BFS / 4가지 연산을 이용하여 1 만들기 (1) | 2024.02.11 |
---|---|
[BFS] 상한 귤 (1) | 2024.02.11 |
[시뮬레이션] 금 채굴하기 (2) | 2024.02.10 |
[이분탐색 - Parametric Search] 삼 오 무 (2) | 2024.02.09 |
[백트래킹] 최소 점프 횟수 (0) | 2024.02.09 |