Python3
문제
코드트리 돌아가는 팔각 의자
키워드
문제 풀이
문제 요구사항
각 의자의 12시 방향에 앉아있는 남쪽 지방의 사람의 착석 여부를 알아내는 프로그램
4개의 팔각 의자를 총 k번 회전시키려고 한다.
한 번 회전할 때 45도씩 즉 한 칸을 움직이고, 회전은 시계 방향과 반시계 방향 모두 가능하다.
회전 규칙
- 회전시킬 의자의 번호와 방향이 주어진다.
- n번째 의자가 회전하기 전 인접한 의자(n-1번째와 n+1번째)에 있던 의자에서 제일 가깝게 마주치는 두 명의 사람의 출신 지역이 다르다면 n번째 의자가 회전할 때 인접한 의자 또한 반대 방향으로 회전한다.
- 회전 요청에 따라 의자를 회전시킨 후 그로 인해 일어나는 모든 회전이 끝날 때까지 기다리고, 이 과정 동안 한 번 회전한 의자는 다시 회전하지 않는다.
변수 및 함수 설명
- chair: 팔각 의자에 앉아있는 사람들의 지역 리스트
(각 지역은 12시 방향부터 시계 방향 순서대로 공백없이 주어지며, 0은 북쪽 지방, 1은 남쪽 지방을 의미)
- k: 회전 횟수
1 ≤ k ≤ 100
- n: 회전시킬 팔각의자의 번호
- d: 회전시킬 방향 d
(방향은 1과 -1로 주어지며 1은 시계방향, -1은 반시계 방향을 의미)
- ans: 12시 방향에 남쪽지방 사람 착석여부 결과값
- left(n, d): 왼쪽 팔각의자를 확인하는 함수
- right(n, d): 오른쪽 팔각의자를 확인하는 함수
풀이
(입력 및 선언)
- 총 네 개의 톱니바퀴를 입력받고 deque을 사용해 wheel 리스트에 저장한다.
(rotate 함수를 사용하기 위함)
- 회전 횟수인 k를 입력받고 총 k번 반복한다.
- 회전시킬 톱니바퀴 번호와 방향을 입력받는다.
- 이때 톱니바퀴 번호는 1부터 시작하지만, 리스트는 0부터 시작하므로 -1을 해준다.
- left 함수로 왼쪽 톱니를 조사하고, right 함수로 오른쪽 톱니를 조사할 것이다.
- 인자는 왼쪽 조사일 때는 현재 톱니바퀴의 왼쪽 톱니(num-1)과 -dir이다.
- 오른쪽 조사일 때는 현재 톱니바퀴의 오른쪽 톱니(num+1)과 -dir이다.
- -dir인 이유는 회전할 톱니번호가 회전하는 방향의 반대방향으로 회전해야 하기 때문
- 현재 톱니바퀴도 dir 방향대로 rotate 시킨다.
(왼쪽 톱니바퀴 조사)
- 만약 톱니가 0보다 작다면 (즉, 첫 번째 톱니를 돌리는 것이라면) 확인할 필요 없다.
- 만약 톱니의 2번째 원소와 현재 톱니의 6번째 원소가 다르다면, 그 왼쪽 톱니바퀴도 조사한다.
- 그리고 현재 톱니를 방향대로 돌린다
(오른쪽 톱니바퀴 조사)
- 만약 톱니가 3보다 크다면 (즉, 마지막 톱니를 돌리는 것이라면) 확인할 필요 없다.
- 만약 톱니의 6번째 원소와 이전 톱니의 2번째 원소가 다르면, 그 오른쪽 톱니바퀴도 조사한다.
- 현재 톱니를 방향대로 돌린다.
(최종 점수 출력)
- 만약 첫 번째 톱니가 1로 시작하면 1점을 누적한다.
- 만약 두 번째 톱니가 1로 시작하면 2점을 누적한다.
- 만약 세 번째 톱니가 1로 시작하면 4점을 누적한다.
- 만약 네 번째 톱니가 1로 시작하면 8점을 누적한다.
최종 코드
from collections import deque
chair = []
ans = 0
def left(n, d):
if n < 0: return
if chair[n][2] != chair[n+1][6]:
left(n-1, -d)
chair[n].rotate(d)
def right(n, d):
if n > 3: return
if chair[n-1][2] != chair[n][6]:
right(n+1, -d)
chair[n].rotate(d)
for _ in range(4):
chair.append(deque(input()))
k = int(input())
for _ in range(k):
n, d = list(map(int, input().split()))
n -= 1
left(n - 1, -d)
right(n + 1, -d)
chair[n].rotate(d)
if chair[0][0] == '1':
ans += 1
if chair[1][0] == '1':
ans += 2
if chair[2][0] == '1':
ans += 4
if chair[3][0] == '1':
ans += 8
print(ans)
피드백
백준 14891. 톱니바퀴 문제와 같음!