본문 바로가기
PS/코드트리

[시뮬레이션] 핀볼게임

by 행복한라이언 2024. 2. 10.
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
반응형