설모의 기록

[백준 14891] 톱니바퀴 본문

알고리즘

[백준 14891] 톱니바퀴

HA_Kwon 2018. 4. 11. 02:07

 이 문제는 4개의 톱니바퀴가 연쇄적으로 회전한 후의 점수를 산출하는 문제입니다. 

 4개의 톱니바퀴는 각각 8개의 톱니를 갖고 있으며 N 또는 S극입니다. 하나의 톱니바퀴를 회전하면 위의 그림과 같이 다른 톱니와 맞닿아 있는 부분이 다른 양 옆의 톱니도 반대방향으로 회전하고, 그 톱니들의 양 옆도 맞닿아 있는 부분이 다르다면 연쇄적으로 회전을 하게 됩니다. 

그림이 어지럽게 그려져서 그렇지, LinkedList로 생각하면 쉽습니다. 시계방향으로 회전하는 것은 리스트의 마지막 요소를 뺴와 첫번째 인덱스에 추가하는 것이고, 반시계방향으로 회전하는 것은 리스트의 첫번째 요소를 빼와 마지막에 추가하는 것과 같습니다. 그리고 회전하기 전에 각각의 톱니바퀴가 양 옆의 톱니바퀴와 맞닿아 있는 곳이 같은지를 체크해주고, 회전해야 할 톱니바퀴를 회전한 후에 연쇄적으로 회전시키면 됩니다.

 저는 우선 톱니바퀴 상태를 입력받은 후에, 입력받은 회전수 K만큼 for문을 돌면서 Relations 들을 설정하고 움직이려는 톱니바퀴를 움직인 뒤 이웃들을 움직이도록 했습니다. 우선 Relation 클래스로 인스턴스를 3개 만들어 각 톱니바퀴 사이의 맞닿은 부분이 같은지 다른지를 저장했습니다. 그 후 해당 톱니바퀴를 회전한 뒤, 재귀함수를 통해 이웃들을 연쇄적으로 회전시켰습니다. 회전시킬 톱니바퀴를 1 ~ 4 로 입력받지만, 인덱스와 헷갈리지 않기 위해 -1 씩 해서 0 ~ 3 톱니바퀴로 바꿨다는 점 알아주세요!


Comments