ye0nn
영차영차
ye0nn
전체 방문자
오늘
어제
  • 분류 전체보기 (61)
    • CS (0)
      • 운영체제 (0)
      • 네트워크 (0)
      • 알고리즘 & 자료구조 (0)
    • 코딩테스트 (48)
      • 프로그래머스 (40)
      • 백준 (8)
    • 프로그래밍 (11)
      • 프론트엔드 (3)
      • 자바스크립트 (0)
      • 스위프트 (7)
      • 파이썬 (1)
    • 취준기록 (1)

인기 글

블로그 메뉴

  • 홈
  • 태그
  • 방명록

티스토리

hELLO · Designed By 정상우.
ye0nn

영차영차

[백준] 14891번: 톱니바퀴 (Python)
코딩테스트/백준

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

2023. 3. 27. 17:08

 

 

 

 

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

 

 

 

✅  Solution

  • 단순 구현 문제였는데, 이해하는데 시간이 좀 걸렸다. 
  • 잘못 생각했던 부분이 톱니바퀴가 차례로 움직인다고 생각했던 것!
    • 그래서 3번 톱니바퀴를 회전 -> 2번, 4번 톱니바퀴를 확인한 뒤 회전 -> 또 1번 확인하고... 땡
    • 위의 방법이 아니라 미리 어떤 톱니바퀴가 움직일지 체크한 뒤, 한 번에 회전하도록 코드를 수정했다.
  • 회전시킬 톱니바퀴의 왼쪽 오른쪽을 나눠서 생각했다.
  • 회전시킬 톱니바퀴의 왼쪽/오른쪽에 있는 톱니바퀴들 중 맞닿은 톱니바퀴의 극이 다른 경우, need_rotate 배열 안에 톱니바퀴의 번호와 방향을 넣어준다.
  • 그리고 한 번에 톱니바퀴를 회전시켜 준 뒤, 점수를 계산해 준다.

 

 

 

 

 

✅  Code

import sys
input = sys.stdin.readline
from collections import deque

def cal_left(idx, check, direction):
    # 비교할 톱니바퀴의 인덱스가 0 이라는 것은 제일 왼쪽에 위치한다는 의미이므로 비교할 필요 없음
    if idx == 0:
        return

	# 현재 톱니바퀴와 그 왼쪽으로 위치한 톱니바퀴의 맞닿는 극 체크 
    if gear[idx][6] != gear[check][2]:
        need_rotate.append((check, direction * (-1)))
        # 계속해서 왼쪽 방향 체크
        cal_left(idx - 1, check - 1, direction * (-1))

def cal_right(idx, check, direction):
    # 비교할 톱니바퀴의 인덱스가 3 이라는 것은 제일 오른쪽에 위치한다는 의미이므로 비교할 필요 없음
    if idx == 3:
        return
        
	# 현재 톱니바퀴와 그 오른쪽으로 위치한 톱니바퀴의 맞닿는 극 체크 
    if gear[idx][2] != gear[check][6]:
        need_rotate.append((check, direction * (-1)))
        # 계속해서 오른쪽 방향 체크
        cal_right(idx + 1, check + 1, direction * (-1))

gear = [deque(map(int, input().rstrip())) for _ in range(4)]
k = int(input())
answer = 0

for _ in range(k):
    need_rotate = []
    g, d = map(int, input().split())
    need_rotate.append((g - 1, d))

    cal_left(g - 1, g - 2, d)
    cal_right(g - 1, g, d)

	# 톱니바퀴 회전
    for idx, direction in need_rotate:
        gear[idx].rotate(direction)

# 점수 계산
for i in range(4):
    if gear[i][0] == 1:
        answer += pow(2, i)

print(answer)

 

 

 

저작자표시 (새창열림)

'코딩테스트 > 백준' 카테고리의 다른 글

[백준] 14499번: 주사위 굴리기 (Python)  (0) 2023.04.03
[백준] 17144번: 미세먼지 안녕! (Python)  (0) 2023.03.28
[백준] 15685번: 드래곤 커브 (Python)  (0) 2023.03.27
[백준] 11404번: 플로이드  (0) 2023.03.07
[백준] 16234번: 인구 이동 (Python)  (0) 2023.03.07
    '코딩테스트/백준' 카테고리의 다른 글
    • [백준] 17144번: 미세먼지 안녕! (Python)
    • [백준] 15685번: 드래곤 커브 (Python)
    • [백준] 11404번: 플로이드
    • [백준] 16234번: 인구 이동 (Python)
    ye0nn
    ye0nn
    프론트엔드 개발자의 개발기록

    티스토리툴바