Algorithem/백준 PS with code

백준 #14891 - 톱니바퀴 : 구현

2023. 5. 19. 12:24
목차
  1. 구현 아이디어
  2. 구현 디테일

(python3)

구현 아이디어

이 문제의 경우 4개의 톱니를 동시에 회전시키는 것 처럼 구현해줄 필요가 있었습니다. 톱니 상황을 하나씩 업데이트 하다 보면 의도한 방향으로 상호작용이 일어나지 않을 수 있기 때문에 이를 고려해줄 필요가 있습니다.

크게 2단계로 구현을 분리했습니다.

1단계 : N번 톱니를 r 방향으로 회전시킬 때, 현재 상황에서 회전될 모든 톱니들과 각 톱니의 회전 방향을 구한다.
이 단계에서는 현재 상황에서 톱니들의 사이에 일어날 상호작용만 체크하고 톱니 상황을 업데이트하지는 않습니다.

2단계 : 1단계에서 구한 정보를 토대로 톱니 방향을 회전시켜 톱니 상황을 업데이트한다.

구현 디테일

톱니의 상태를 배열로 나타내는데, 회전할때마다 배열의 모든 값을 밀거나 당기기는 방향으로 업데이트를 해줄 수 도 있지만, 어떤 톱니가 12시 방향을 가리키고 있는지, 인덱스를 짚어주는 int 값을 하나 따로 두는 방식으로도 관리해줄 수 있습니다.

 저는 톱니가 서로 맞닿는 (상호작용이 일어나는) 6개의 포인트들의 인덱스를 gi 라는 배열로 따로 저장하여 관리했습니다. (12시 방향을 가리키는 인덱스만 관리하는게 편할 것 같긴 합니다.)

굉장히 하드코딩을 했기 때문에... 톱니 수가 많아지면 1단계 알고리즘을 많이 고쳐야할 듯 합니다.

# https://www.acmicpc.net/problem/14891
def solution(input) : 
    """
    톱니바퀴 번호 = 1, 2, 3, 4
    톱니바퀴 초기 상태 G = [_,1,2,3,4]
    톱니바퀴의 붙어있는 지점 (index) 를 표현한 dict : gi = [12, 21, 23, 32, 34, 43] 이 인덱스를 수정하면서 톱니의 회전을 표현
    """

    # 기어 정보 받아오기 (12시부터 시계방향, N극 = 0, S극 = 1)
    G = [0,]
    for _ in range(4) :
        g = input().strip()
        gi = []
        for t in g :
            gi.append(int(t))
        G.append(gi)
    # 회전수 정보 받아오기
    K = int(input())
    # 회전할 톱니 번호와 방향 받아오기
    R = []
    for _ in range(K) :
        R.append(tuple(map(int, input().split())))
    # 톱니의 회전 상태를 표현해줄 gi 배열 생성
    gi = [2,6,2,6,2,6]

    def rotate(Gn, d) :
        """
        n번 기어를 d 방향으로 회전 (기어의 상호작용은 고려 X)
        """
        d = -d
        if Gn == 1 :
            gi[0]+=d
        elif Gn ==2 :
            gi[1]+=d
            gi[2]+=d
        elif Gn==3 :
            gi[3]+=d
            gi[4]+=d
        else :
            gi[5]+=d
        for i, g in enumerate(gi) :
            if g == 8 :
                gi[i] = 0
            elif g == -1 :
                gi[i] = 7
        
    def check_rotate_gear(M,r) :
        """
        M 번 기어를 r 방향으로 회전할 때 회전될 모든 기어와 방향을 list 로 묶어서 반환
        """
        rg = [(M,r)]
        diff_pole = [G[1][gi[0]] != G[2][gi[1]],
                     G[2][gi[2]] != G[3][gi[3]],
                     G[3][gi[4]] != G[4][gi[5]]]
        if M==1 :
            if diff_pole[0] :
                rg.append((2,-r))
                if diff_pole[1] :
                    rg.append((3,r))
                    if diff_pole[2] :
                        rg.append((4,-r))
        elif M==2 :
            if diff_pole[0] :
                rg.append((1,-r))
            if diff_pole[1] :
                rg.append((3,-r))
                if diff_pole[2] :
                    rg.append((4,r))
        elif M==3 :
            if diff_pole[1] :
                rg.append((2,-r))
                if diff_pole[0] :
                    rg.append((1,r))
            if diff_pole[2] :
                rg.append((4,-r))
        elif M==4 :
            if diff_pole[2] :
                rg.append((3,-r))
                if diff_pole[1] :
                    rg.append((2,r))
                    if diff_pole[0] :
                        rg.append((1,-r))
        return rg
    
    def rotate_all(M,r) :
        """
        M번 기어를 r 방향으로 회전할 때 상호작용을 고려하여 4개 기어를 모두 회전
        """
        rotate_list = check_rotate_gear(M,r)
        for i in rotate_list :
            rotate(*i)

    for r in R :
        rotate_all(*r)

    # 기어들의 12시 방향 극 확인
    gear_12 = [G[1][gi[0]-2], G[2][gi[2]-2], G[3][gi[4]-2], G[4][gi[5]-6]]
    # 점수 계산
    score = [1,2,4,8]
    final_score = 0
    for a,b in zip(gear_12,score) :
        final_score += a*b

    print(final_score)

solution(input)

'Algorithem > 백준 PS with code' 카테고리의 다른 글

백준 #19236 - [G2] 청소년 상어 : 구현, back tracking  (0) 2023.05.20
백준 #14502 - 연구소 : 구현, 그래프 탐색  (0) 2023.05.19
백준 #14888 - 연산자 끼워넣기 : 재귀  (0) 2023.05.17
백준 #14501 - 퇴사 : DP  (0) 2023.05.15
백준 #16235 - 나무 재테크 : 구현, 시간  (0) 2023.05.11
  1. 구현 아이디어
  2. 구현 디테일
'Algorithem/백준 PS with code' 카테고리의 다른 글
  • 백준 #19236 - [G2] 청소년 상어 : 구현, back tracking
  • 백준 #14502 - 연구소 : 구현, 그래프 탐색
  • 백준 #14888 - 연산자 끼워넣기 : 재귀
  • 백준 #14501 - 퇴사 : DP
jamong5
jamong5
데이터 엔지니어를 희망하는 개발자 지망생
jamong5
JAMONG5
jamong5
전체
오늘
어제
  • 분류 전체보기 (171)
    • Algorithem (92)
      • 백준 PS with code (64)
      • 프로그래머스 PS with code (9)
      • 알고리즘 이론 (3)
    • Languages (19)
      • Python (10)
      • Java (2)
      • C & C++ (7)
    • SQL (42)
      • 프로그래머스 MySQL with code (41)
      • MySQL (1)
    • CS (2)
    • DevOps (4)
      • Docker (1)
      • Git, GitHub (3)
    • 코드 고민 (1)
    • 도움을 받은 정보 (2)
    • 책 (4)
    • 보드 게임 일기 (1)
    • 컴퓨터 일기 (2)
    • R&D 휴지통 (0)

블로그 메뉴

  • 소개
  • 홈
  • 태그

공지사항

인기 글

태그

  • MySQL
  • Git
  • 백트래킹
  • 시간초과
  • 백준
  • 스택
  • 파이썬
  • 그래프탐색
  • Python
  • 구현
  • join
  • 최소힙
  • LCS
  • 투포인터
  • 똥이
  • SQL
  • 프로그래머스
  • backtracking
  • 알고리즘
  • heapq

최근 댓글

최근 글

hELLO · Designed By 정상우.
jamong5
백준 #14891 - 톱니바퀴 : 구현
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.