보물창고 블로그

SW Expert Academy 5650. [모의 SW 역량테스트] 핀볼 게임 본문

알고리즘 풀이/SW Expert Academy

SW Expert Academy 5650. [모의 SW 역량테스트] 핀볼 게임

홋 메 2020. 3. 10. 20:35
728x90

문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo&categoryId=AWXRF8s6ezEDFAUo&categoryType=CODE

 

SW Expert Academy

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

swexpertacademy.com

상당히 애를 먹었던 문제이다. 웜홀 구현에 애를 많이 먹었다. 해결한 코드는 아래와 같다.

from collections import deque


def solution(x, y, map1, portal, n):
    global answer
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
    queue = deque()
    for d in range(4):
        queue.append([x+dx[d], y+dy[d], d, 0])
    while queue:
        x1, y1, d, count = queue.popleft()
        if x1 == -1 or x1 == n or y1 == -1 or y1 == n:
            if 2 * count + 1 > answer:
                answer = 2 * count + 1
            continue
        elif x1 == x and y1 == y:
            if count > answer:
                answer = count
            continue
        elif map1[x1][y1] == -1:
            if count > answer:
                answer = count
            continue
        elif map1[x1][y1] == 1:
            count += 1
            if d == 1:
                d = 0
            elif d == 2:
                d = 3
            else:
                d = (d + 2) % 4
        elif map1[x1][y1] == 2:
            count += 1
            if d == 0:
                d = 3
            elif d == 1:
                d = 2
            else:
                d = (d + 2) % 4
        elif map1[x1][y1] == 3:
            count += 1
            if d == 0:
                d = 1
            elif d == 3:
                d = 2
            else:
                d = (d + 2) % 4
        elif map1[x1][y1] == 4:
            count += 1
            if d == 2:
                d = 1
            elif d == 3:
                d = 0
            else:
                d = (d + 2) % 4
        elif map1[x1][y1] == 5:
            count += 1
            d = (d + 2) % 4
        elif map1[x1][y1] > 5:
            for p in portal[map1[x1][y1]]:
                if p != [x1, y1]:
                    x1 = p[0]
                    y1 = p[1]
                    break
        queue.append([x1 + dx[d], y1 + dy[d], d, count])


t = int(input())
for test in range(1, t + 1):
    n = int(input())
    answer = 0
    field = []
    portal = {}
    zeros = []
    for i in range(n):
        s = list(map(int, input().split()))
        for j in range(n):
            if s[j] == 0:
                zeros.append((i, j))
            elif 5 < s[j]:
                if portal.get(s[j]) is None:
                    portal[s[j]] = [[i, j]]
                else:
                    portal[s[j]].append([i, j])
        field.append(s)
    for p1 in zeros:
        solution(p1[0], p1[1], field, portal, n)
    print('#{} {}'.format(test, answer))
Comments