[파이썬]SWEA 4013 특이한자석

Byeonghyeon Kim·2021년 3월 18일
0

알고리즘문제

목록 보기
37/93
post-thumbnail

링크

SWEA 4013 특이한자석


삼성 A형 테스트를 준비하며 풀어본 문제이다.
조건을 주는게 조금 까다롭긴한데 문제자체가 어려운 문제는 아닌것 같다.

좌우를 살피면서 다른 극을 갖고 있으면 해당 방향의 다음 자석을 탐색하는 식으로 어디까지 돌려야 하는지 찾았다. 그 후 시계방향, 반시계방향에 맞춰 자석을 돌려주었다.

원형큐를 만들어서 front와 rear를 계산하며 자석을 돌릴수도 있을 것 같지만
아직 그런식으로 접근하는게 조금 헷갈려 실제로 dequeue에 넣었다 빼가면서 구현했다.


정답 코드

from collections import deque

def rotate(gear, rot):
    if rot == 1:
        mag[gear].appendleft(mag[gear].pop())
    if rot == -1:
        mag[gear].append(mag[gear].popleft())

for tc in range(1, int(input()) + 1):
    K = int(input())
    mag = [[-1] * 8]
    for _ in range(4):
        mag.append(deque(map(int, input().split())))
    mag.append([-1] * 8)

    for _ in range(K):
        gear, rot = map(int, input().split())
        rotate_list = [gear]
        left = mag[gear][6]
        right = mag[gear][2]
        i = 1
        j = 1
        while left != mag[gear - i][2] and mag[gear - i][2] != -1:
            left = mag[gear - i][6]
            rotate_list.append(gear - i)
            i += 1
        while right != mag[gear + j][6] and mag[gear + j][6] != -1:
            right = mag[gear + j][2]
            rotate_list.append(gear + j)
            j += 1

        for rotating_gear in rotate_list:
            if abs(gear - rotating_gear) == 0:
                rotate(rotating_gear, rot)
            if abs(gear - rotating_gear) == 1:
                a = rot * -1
                rotate(rotating_gear, a)
            if abs(gear - rotating_gear) == 2:
                rotate(rotating_gear, rot)
            if abs(gear - rotating_gear) == 3:
                a = rot * -1
                rotate(rotating_gear, a)

    score = 0
    for i in range(1, 5):
        score += (mag[i][0] * (2 ** (i - 1)))

    print('#{} {}'.format(tc, score))

알게된 것👨‍💻

  • 조건이 까다로울 땐 종이에 먼저 적어가면서 생각한 후 코드를 작성하자
profile
자기 주도 개발전 (개발, 발전)

0개의 댓글