[코드트리] 돌아가는 팔각 의자

Jimeaning·2023년 11월 9일
0

코딩테스트

목록 보기
130/143

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  # 배열 인덱스가 0부터 시작하므로

    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. 톱니바퀴 문제와 같음!

profile
I mean

0개의 댓글