알고리즘
[백준] 14891. 톱니바퀴 - python
hseoky
2024. 6. 12. 09:33
728x90
https://www.acmicpc.net/problem/14891
난이도: 골드4
알고리즘: 단순 구현
풀이과정
단순 구현 문제로, 구현을 위해서 먼저 문제를 정확하게 파악하는게 중요할 것 같다.
예제 1번의 경우 위와 같은 상황에서 3번 바퀴를 반시계 방향으로 회전
하는 상황이다.
3번 바퀴의 왼쪽 바퀴와 맞닿는 톱니가 서로 다른 극이므로 2번 바퀴는 회전한다.
이 때 3번 바퀴와 반대 방향
인 시계 방향
으로 회전하게 된다.
2번 바퀴가 회전하므로 1번 바퀴 또한 회전 여부를 확인해 주어야 한다.(만약 2번 바퀴가 회전하지 않는다면 1번 바퀴는 회전하지 않는다.)
1번 바퀴와 2번 바퀴의 맞닿는 톱니가 서로 다른 극이므로 1번 바퀴도 회전한다.
이 때 2번 바퀴와 반대 방향
인 반시계 방향
으로 회전하게 된다.
이제 3번 바퀴의 오른쪽 바퀴인 4번 바퀴를 살펴본다.
4번 바퀴는 3번 바퀴와 맞닿는 톱니가 서로 같은 극이므로 회전하지 않는다.
이제 위 상황을 코드로 구현만 하면 된다.
소스코드
def rotate(gear_idx, dir):
global gears
gear = gears[gear_idx]
new_gear = [0] * 8
if dir == 1: # 시계 방향
for i in range(8):
new_gear[i] = gear[(i - 1) % 8]
else: # 반시계 방향
for i in range(8):
new_gear[i] = gear[(i + 1) % 8]
gears[gear_idx] = new_gear
gears = [[]] # 1번부터 시작하기 위해 0번째에 빈 리스트 할당
for _ in range(4):
gear = input()
gear = [int(c) for c in gear]
gears.append(gear)
k = int(input())
for _ in range(k):
gear_idx, dir = map(int, input().split())
rotate_gears = [(gear_idx, dir)]
# 왼쪽 바퀴들 확인
cur_idx = gear_idx
cur_dir = dir
while cur_idx > 1:
# 극이 서로 다르다면 회전리스트에 포함
if gears[cur_idx - 1][2] != gears[cur_idx][6]:
rotate_gears.append((cur_idx - 1, cur_dir * -1))
cur_idx = cur_idx - 1
cur_dir = cur_dir * -1
# 극이 서로 같다면 회전하지 않으므로 break
else:
break
# 오른쪽 바퀴 확인
cur_idx = gear_idx
cur_dir = dir
while cur_idx < 4:
# 극이 서로 다르다면 회전리스트에 포함
if gears[cur_idx][2] != gears[cur_idx + 1][6]:
rotate_gears.append((cur_idx + 1, cur_dir * -1))
cur_idx = cur_idx + 1
cur_dir = cur_dir * -1
# 극이 서로 같다면 회전하지 않으므로 break
else:
break
# 회전
for gear, dir in rotate_gears:
rotate(gear, dir)
# 점수 계산
answer = 0
for i in range(1, 5):
if gears[i][0] == 1:
answer += (2 ** (i - 1)) # 1, 2, 4 ,8 점
print(answer)
728x90