코딩 공부

[Python](구현) 백준 14891번 : 톱니바퀴 본문

삼성 SW 역량 테스트 기출 문제

[Python](구현) 백준 14891번 : 톱니바퀴

Algomalgo 2024. 1. 18. 19:57
728x90


<접근 방법>

  1. 우선, 톱니바퀴가 4개로 고정되어 있으므로 gear라는 이차원 배열을 4줄짜리로 받는다.
  2. 각 회전마다 선택된 기어(spin_gear)와 d(방향)이 정해지므로
    각 회전별 톱니바퀴 4개의 방향 변화 정보를 저장할 status = [0, 0, 0, 0]를 만들어준다.
  3. 선택된 기어(spin_gear)의 왼쪽과 오른쪽으로 나눠서 맞닿는 극이 서로 다르면 현재 방향에 -1을 곱해준 값을 저장하고, 극이 다르지 않다면 더이상 기어가 돌아가지 않으므로 break를 통해 for문을 빠져나온다.
    (이때, 맞닿는 극이 각 gear의 2번째 원소인지, 6번째 원소인지 유의하도록 한다.)
  4. 4개의 기어의 방향 정보가 모두 저장이 됐다면,
    반시계 방향으로 회전(status[i]==-1)할 경우, 맨 앞 숫자를 떼서 맨 뒤로 붙이고,
    시계 방향으로 회전(status[i]==1)할 경우, 맨 뒤 숫자를 떼서 맨 앞으로 붙인다.
  5. 점수는 각 줄의 번호의 2의 각 줄 번호 제곱승이므로 2**i로 점수를 더해간다.

 

gear = [list(map(int, input())) for _ in range(4)]
K = int(input())    # K : 회전 횟수
for _ in range(K):
    status = [0, 0, 0, 0]   # 각 회전마다 톱니바퀴의 방향 변화 저장
    spin_gear, d = map(int, input().split())
    status[spin_gear-1] = d     # 선택된 톱니바퀴 방향 저장
    
    temp = d    # 선택된 톱니 바퀴 방향 기준
    
    # 왼쪽 톱니바퀴들
    for number in range(spin_gear-1, 0, -1):
        if gear[number][6] != gear[number-1][2]:	# 극이 다르면 회전
            temp *= -1
            status[number-1] = temp
        else: break

    # 오른쪽 톱니바퀴들
    temp = d
    for number in range(spin_gear-1, 3):
        if gear[number][2] != gear[number+1][6]:	# 극이 다르면 회전
            temp *= -1
            status[number+1] = temp
        else: break

    # 방향 정보가 모두 저장됐다면
    for i in range(4):
        if status[i] == -1:     # 반시계 방향으로 회전할 시
            gear[i] = gear[i][1:] + [gear[i][0]]
        elif status[i] == 1:    # 시계 방향으로 회전할 시
            gear[i] = [gear[i].pop()] + gear[i][:7]

total = 0
for i in range(4):
    if gear[i][0] == 1:     # 12시 방향 톱니바퀴가 S극이라면
        total += 2**i
print(total)

예제 3번의 각 회전마다의 톱니바퀴 상태

 

이해가 안되는 부분이 있으면 질문 주세요. 감사합니다.

728x90