-
[코테] 백준 14891 톱니바퀴 파이썬코딩테스트 2025. 1. 22. 23:36
https://www.acmicpc.net/problem/14891
빡구현으로 유명한 삼성 기출문제이다. 꼼꼼하지 못한 나는 언제 이런 문제를 빠르게 풀 수 있을까,, 한숨이 나왔지만 어쨌든 정진하기로...ㅠㅜㅠ
이 문제의 특징은 톱니바퀴의 회전을 양옆으로 전파 시켜야 한다는 것이다. 나는 처음에 각 톱니바퀴의 순서에 따라 회전하는 방향을 모두 지정하려고 했었는데, 굳이 그럴 필요가 없었다.
import sys
read = sys.stdin.readlinecogwheel_state = []for _ in range(4):cogwheel_state.append(list(map(int,read().rstrip())))
K = int(input())turns = []for _ in range(K):turns.append(list(map(int,read().split())))
def clockwise(wheel):new = [wheel[-1]]for w in wheel[:-1]:new.append(w)return new
def counter_clockwise(wheel):new = []for w in wheel[1:]:new.append(w)new.append(wheel[0])return new
for turn in turns:# 맞닿는 톱니 위치meets = [[None,cogwheel_state[0][2]],[cogwheel_state[1][6],cogwheel_state[1][2]],[cogwheel_state[2][6],cogwheel_state[2][2]],[cogwheel_state[3][6],None]]# 안움직이면 0, 시계방향 1, 반시계방향 -1 로 저장move_or_not = [0] * 4# 시작 톱니바퀴 회전 방향 저장move_or_not[turn[0]-1] = turn[1]# 왼쪽으로 전파for i in range(turn[0] - 1, 0, -1):if meets[i][0] != meets[i - 1][1]:move_or_not[i - 1] = -move_or_not[i]else:break
# 오른쪽으로 전파for i in range(turn[0] - 1, 3):if meets[i][1] != meets[i + 1][0]:move_or_not[i + 1] = -move_or_not[i]else:breakfor idx,mv in enumerate(move_or_not):if mv == 1:cogwheel_state[idx] = clockwise(cogwheel_state[idx])elif mv == -1:cogwheel_state[idx] = counter_clockwise(cogwheel_state[idx])
score = 0
if cogwheel_state[0][0] == 1:score += 1if cogwheel_state[1][0] == 1:score += 2if cogwheel_state[2][0] == 1:score += 4if cogwheel_state[3][0] == 1:score += 8
print(score)'코딩테스트' 카테고리의 다른 글
[코테]백준 16236 아기상어 파이썬 (0) 2025.01.31 [코테]99클럽 코테 스터디 10일차 TIL 백준 2573 빙산 (0) 2025.01.26 [코테]99클럽 코테스터디 8일차 TIL 백준 2667 단지번호붙이기 (0) 2025.01.22 [코테]99클럽 코테스터디 7일차 TIL 백준 1697 숨바꼭질 (0) 2025.01.21 [코테]99클럽 코테스터디 6일차 TIL 백준 1260 DFS와 BFS (0) 2025.01.20