문제
총 4개의 팔각 의자에 두 지역에서 온 사람들이 앉아있습니다. 각각 북부 지방과 남부 지방으로 N과 S로 표시됩니다. 팔각 의자는 왼쪽에서부터 오른쪽까지 각각 1번부터 4번까지의 번호가 붙어있습니다.
각각의 의자를 총 k번 회전시키려고 합니다. 한 번 회전할 때 45도씩 즉 한 칸을 움직이고, 회전은 시계 방향과 반시계 방향 모두 가능합니다. 아래 예시처럼 회전할 수 있습니다.
회전 요청은 다음과 같은 규칙을 가집니다.
- 회전시킬 의자의 번호와 방향이 주어집니다.
- n번째 의자가 회전하기 전 인접한 의자(n-1번째와 n+1번쨰)에 있던 의자에서 제일 가깝게 마주치는 두 명의 사람의 출신 지역이 다르다면 n번째 의자가 회전할 때 인접한 의자 또한 반대 방향으로 회전하게 됩니다.
- 회전 요청에 따라 의자를 회전시킨 후 그로 인해 일어나는 모든 회전이 끝날 때까지 기다립니다. 이 과정 동안 한 번 회전한 의자는 다시 회전하지 않습니다.
예를 들어 위과 같은 상황에서 3번째 의자를 시계 방향으로 회전하라는 요청이 주어질 때, 4번째 의자는 가장 가까운 두 명의 출신 지역이 같기 때문에 회전하지 않습니다. 2번째 의자의 경우 3번째 의자와 가까운 두 명 출신 지역이 다르기 때문에 3번째 의자가 회전할 때 반대 방향인 반시계 방향으로 회전하게 됩니다. 2번째 의자와 1번째 의자에서 가장 가까운 두 명 역시 출신 지역이 다르기 때문에 2번째 의자가 반시계 방향으로 회전할 때 1번째 의자는 시계 방향으로 회전하게 됩니다. 이렇듯 각 의자의 회전 방향은 동시에 결정됨에 유의합니다. 따라서 일어나는 결과는 다음과 같습니다.
이때 각 의자의 12시 방향에 앉아있는 남쪽 지방의 사람의 착석 여부를 알아내는 프로그램을 작성하세요.
입력 형식
첫번째 줄에는 첫번째 팔각 의자에 앉아있는 사람들의 지역이 주어집니다.
두번째 줄에는 두번째 팔각 의자에 앉아있는 사람들의 지역이 주어집니다.
세번째 줄에는 세번째 팔각 의자에 앉아있는 사람들의 지역이 주어집니다.
네번째 줄에는 네번째 팔각 의자에 앉아있는 사람들의 지역이 주어집니다.
각 지역은 12시 방향부터 시계 방향 순서대로 공백없이 주어지며, 0은 북쪽 지방, 1은 남쪽 지방을 의미합니다.
다섯번째 줄에는 회전 횟수 k가 주어집니다.
6번째 줄부터 (k+5)번째 줄까지 회전시킬 팔각의자의 번호 n와 방향 d가 공백을 사이에 두고 주어집니다. 방향은 1과 -1로 주어지며 1은 시계방향, -1은 반시계 방향을 의미합니다.
- 1 ≤ k ≤ 100
출력 형식
12시 방향에 남쪽지방 사람 착석여부를 각 테이블에 대하여 s1, s2, s3, s4라고 할 때 1*s1 + 2*s2 + 4*s3 + 8*s4를 출력합니다. 각 s값은 착석시 1 아니면 0 값을 갖습니다.
풀이
Code
from collections import deque
# 1. 팔각의자 정보 입력받기
chairs = [[]] + [deque(list(map(int, input()))) for _ in range(4)]
k = int(input())
# 2.
for _ in range(k) :
# 2-1. 각 팔각의자의 회전 여부 리스트 생성
info = [0 for _ in range(5)]
# 2-2. 회전 정보 입력받기
n, d = map(int, input().split())
# 2-3. 회전 여부 리스트에 정보 입력
info[n] = d
# 2-4.
for i in range(n, 1, -1) :
# 2-4-1. 인접한 사람의 출신지가 다를 경우 회전 여부 리스트에 정보 입력
if chairs[i-1][2] != chairs[i][6] : info[i-1] = -info[i]
# 2-4-2. 인접한 사람의 출신지가 같을 경우 for문 탈출
else : break
# 2-5.
for i in range(n, 4) :
# 2-5-1. 인접한 사람의 출신지가 다를 경우 회전 여부 리스트에 정보 입력
if chairs[i][2] != chairs[i+1][6] : info[i+1] = -info[i]
# 2-5-2. 인접한 사람의 출신지가 같을 경우 for문 탈출
else : break
# 2-6. 팔각의자 회전
for i in range(1, 5) :
if info[i] == 1 :
chairs[i].appendleft(chairs[i].pop())
elif info[i] == -1 :
chairs[i].append(chairs[i].popleft())
# 3. 결과 출력
print(chairs[1][0] + 2 * chairs[2][0] + 4 * chairs[3][0] + 8 * chairs[4][0])
'Coding Test > Codetree' 카테고리의 다른 글
[Python/Codetree] 코드트리 빵 (0) | 2023.10.13 |
---|---|
[Python/Codetree] 포탑 부수기 (0) | 2023.10.12 |
[Python/Codetree] 토스트 계란틀 (1) | 2023.10.03 |
[Python/Codetree] 병원 거리 최소화하기 (0) | 2023.09.30 |
[Python/Codetree] 나무 타이쿤 (0) | 2023.09.29 |