공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 백준 14891. 톱니바퀴

inspirit941 2020. 1. 5. 18:18
반응형

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

저 긴 글에서 '문제에 필요한 조건'을 정확히 찾아내고 구현해야 하는 시뮬레이션 문제.

 

시계 방향 / 반시계 방향으로 값을 회전시켜야 하기 때문에, 양 끝에서 값을 빼고 넣는 게 가능한 deque를 사용했다.

문제의 조건을 요약하자면

 

1. 처음 톱니바퀴가 움직이기 전에, 인접한 톱니바퀴가 움직일 수 있는지 없는지를 전부 검사한 뒤에야 톱니바퀴를 움직일 수 있다.

2. 인접한 톱니바퀴의 인접한 톱니바퀴도 전부 검사해야 한다. ex) 2번 톱니바퀴 -> 3번 톱니바퀴 검사 -> 3번 톱니바퀴와 인접한 4번도 검사

3. '회전 여부'를 결정짓는 '인접한 톱니바퀴의 톱날'은 index 2번과 6번이다.

4. 주어진 톱니바퀴는 일단 회전하는 것이 전제되어 있다. 인접 톱니바퀴가 전부 회전하지 않는다 해도, 처음 주어진 톱니바퀴는 반드시 회전해야만 한다.

5. 인접한 톱니바퀴는 주어진 톱니바퀴와 반대 방향으로 회전해야 한다.

 

4번 때문에 문제를 푸는 데 너무 오래 걸렸다. 인접 톱니바퀴가 움직일 수 없다면, 처음 주어진 톱니바퀴도 움직이지 않는 걸로 이해하고 코드를 만들었기 때문이다.

 

회전 자체는 deque의 rotate 함수를 사용하면 된다. 시계 방향은 1, 반시계 방향은 -1을 파라미터로 넣으면 된다. 

 

 

 

 

반응형