구현 - 톱니바퀴

jisu_log·2025년 4월 6일

알고리즘 문제풀이

목록 보기
18/105


입력 인덱스 범위와 코드 내 인덱스 범위 틀리는 것 주의
왼쪽 오른쪽 신경쓰다가 자기 자신 회전 잊지 않기
함수 호출할 때 인자 정확히 넘겨주기

wheels = []  # 2차원 리스트

# 톱니바퀴 4개 상태 저장
for _ in range(4):
    line = input()
    l = []
    for i in range(0, len(line)):
        l.append(int(line[i : i + 1]))
    wheels.append(l)


k = int(input())

# 0~1, 1~2, 2~3 번 톱니가 서로 극이 다른지를 저장하는 리스트, (True면 같고, False면 다름)
wheels_state = [True] * 3


def spin(num, d):
    if d == 1:  # 시계방향
        temp = wheels[num][0]
        wheels[num][0] = wheels[num][7]
        wheels[num][7] = wheels[num][6]
        wheels[num][6] = wheels[num][5]
        wheels[num][5] = wheels[num][4]
        wheels[num][4] = wheels[num][3]
        wheels[num][3] = wheels[num][2]
        wheels[num][2] = wheels[num][1]
        wheels[num][1] = temp
    else:  # 반시계방향
        temp = wheels[num][0]
        wheels[num][0] = wheels[num][1]
        wheels[num][1] = wheels[num][2]
        wheels[num][2] = wheels[num][3]
        wheels[num][3] = wheels[num][4]
        wheels[num][4] = wheels[num][5]
        wheels[num][5] = wheels[num][6]
        wheels[num][6] = wheels[num][7]
        wheels[num][7] = temp


def check_state():
    # 0번과 1번 사이 극이 서로 다르다면
    if wheels[0][2] != wheels[1][6]:
        wheels_state[0] = False
    else:
        wheels_state[0] = True
    # 1번과 2번
    if wheels[1][2] != wheels[2][6]:
        wheels_state[1] = False
    else:
        wheels_state[1] = True
    # 2번과 3번
    if wheels[2][2] != wheels[3][6]:
        wheels_state[2] = False
    else:
        wheels_state[2] = True


def check_left(num, d):
    left = num - 1
    # 회전 톱니의 왼쪽에 톱니가 있으면서 극이 다르다면
    if left >= 0 and wheels_state[left] == False:
        # 왼쪽 톱니는 반대로 회전
        spin(left, -d)
        # 회전시킨 왼쪽 옆에 또 톱니가 존재한다면 재호출
        if left - 1 >= 0:
            check_left(left, -d)  # d가 아니라 -d로 호출해줘야 함을 주의!!


def check_right(num, d):
    right = num + 1
    # 회전 톱니의 오른쪽에 톱니가 있으면서 극이 다르다면
    # state는 0, 1, 2까지만 있음을 주의!!
    if right < 4 and wheels_state[right - 1] == False:
        # 오른쪽 톱니는 반대로 회전
        spin(right, -d)
        # 회전시킨 오른쪽 옆에 또 톱니가 존재한다면 재호출
        if right + 1 < 4:
            check_right(right, -d)  # d가 아니라 -d로 호출해줘야 함을 주의!!!


# k번의 회전 진행
for i in range(0, k):
    num, d = map(int, input().split())
    # 현재 톱니들의 상태 체크
    check_state()

    # 입력되는 num의 범위가 1부터 4임을 주의!!!!
    spin(num - 1, d)  # 회전하고자 하는 톱니부터 회전!!!!
    check_left(num - 1, d)  # 현재 회전시키고자 하는 톱니 기준으로 왼쪽 톱니 체크
    check_right(num - 1, d)  # 현재 톱니 기준 오른쪽 톱니 체크

# 4개의 톱니바퀴 점수 합산
score = 0
# 0번 톱니 12시 방향이 S극이면
if wheels[0][0] == 1:
    score += 1  # 1점
if wheels[1][0] == 1:
    score += 2  # 2점
if wheels[2][0] == 1:
    score += 4  # 4점
if wheels[3][0] == 1:
    score += 8  # 8점

print(score)

0개의 댓글