본문 바로가기

Problem Solving/swea

[SWEA] 5650. 핀볼 게임(Python) / Simulation

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

SW Expert Academy 삼성 SW 역량 테스트 모의 문제에서 평범한 난이도의 시뮬레이션 문제이다.

  • 1시간 1분 소요
  • 특별한 알고리즘 X, 있는 그대로 구현하는 simulation 문제
  • 웜홀 정보 딕셔너리(wormhole_info)에 저장하여 웜홀 만났을 때 즉시 위치 바꿔줌
  • 블록별로 상하좌우에서 왔을 때 어떻게 방향이 바뀌는지 change_dir에 정보 미리 저장해둠

 

파이썬 코드는 다음과 같다.


# 상하좌우
dr = (-1, 1, 0, 0)
dc = (0, 0, -1, 1)

# 블록별 방향 바꾸기
change_dir = ((),
              (1, 3, 0, 2),
              (3, 0, 1, 2),
              (2, 0, 3, 1),
              (1, 2, 3, 0),
              (1, 0, 3, 2))

# 게임 시작 위치와 방향 넘기면 게임 횟수 리턴
def play_game(r, c, d):
    global wormhole_info
    score = 0
    sr, sc = r, c       # 시작 위치 저장
    while True:
        r += dr[d]      # 이동하면서 시작해야 함
        c += dc[d]
        # 출발 위치로 돌아오거나 블랙홀 만나면 게임 끝. 점수 리턴
        if (r, c) == (sr, sc) or A[r][c] == -1:
            return score
        if 1 <= A[r][c] <= 5:           # 블록 만나면 방향 바꾸고 점수 + 1
            d = change_dir[A[r][c]][d]
            score += 1
        elif 6 <= A[r][c] <= 10:        # 웜홀 만나면 같은 번호의 웜홀로 이동. 방향은 유지
            r, c = wormhole_info[(r, c)]

# main
T = int(input())
for tc in range(T):
    N = int(input())
    wormhole_check = [0] * 11
    wormhole_info = dict()      # 웜홀 쌍 정보
    A = [[5] * (N+2)]   # 맵 벽(5)으로 둘러싸기
    for i in range(1, N+1):
        A.append([5] + list(map(int, input().split())) + [5])
        for j in range(1, N+1):
            if 6 <= A[i][j] <= 10:
                num = A[i][j]
                if not wormhole_check[num]:
                    wormhole_check[num] = (i, j)
                else:   # 같은 번호 웜홀끼리 위치 정보 저장
                    wormhole_info[wormhole_check[num]] = (i, j)
                    wormhole_info[(i, j)] = wormhole_check[num]
    A.append([5] * (N+2))

    # 게임 시작
    MAX = float('-inf')  # 게임에서 얻을 수 있는 최대 점수
    for sr in range(1, N+1):
        for sc in range(1, N+1):
            if A[sr][sc] == 0:      # 시작 위치와 방향 정한 후 게임 start
                for sd in range(4):
                    MAX = max(MAX, play_game(sr, sc, sd))
    print("#{} {}".format(tc+1, MAX))

  •  고찰 : 미리 어떻게 짤지 구상한 후 코드로 옮기니 오래 걸리지 않았다. 어떤 자료구조와 알고리즘을 쓸지 설계하는 것이 시간 단축에 효과적이다. 비슷한 문제가 나올 경우 금방 풀어낼 수 있을 것 같다. 늘 힘내자.