반응형
[백준 14891번] 톱니바퀴 - Kotlin
https://www.acmicpc.net/problem/14891
문제
- 총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다.
- 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다.
- 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴가 1번, 그 오른쪽은 2번, 그 오른쪽은 3번, 가장 오른쪽 톱니바퀴는 4번이다.
- 이때, 톱니바퀴를 총 K번 회전시키려고 한다.
- 톱니바퀴의 회전은 한 칸을 기준으로 한다.
- 회전은 시계 방향과 반시계 방향이 있고, 아래 그림과 같이 회전한다.
- 톱니바퀴를 회전시키려면, 회전시킬 톱니바퀴와 회전시킬 방향을 결정해야 한다.
- 톱니바퀴가 회전할 때, 서로 맞닿은 극에 따라서 옆에 있는 톱니바퀴를 회전시킬 수도 있고, 회전시키지 않을 수도 있다.
- 톱니바퀴 A를 회전할 때, 그 옆에 있는 톱니바퀴 B와 서로 맞닿은 톱니의 극이 다르다면, B는 A가 회전한 방향과 반대방향으로 회전하게 된다.
- 예를 들어, 아래와 같은 경우를 살펴보자.
- 두 톱니바퀴의 맞닿은 부분은 초록색 점선으로 묶여있는 부분이다.
- 여기서, 3번 톱니바퀴를 반시계 방향으로 회전했다면, 4번 톱니바퀴는 시계 방향으로 회전하게 된다.
- 2번 톱니바퀴는 맞닿은 부분이 S극으로 서로 같기 때문에, 회전하지 않게 되고, 1번 톱니바퀴는 2번이 회전하지 않았기 때문에, 회전하지 않게 된다.
- 따라서, 아래 그림과 같은 모양을 만들게 된다.
- 위와 같은 상태에서 1번 톱니바퀴를 시계 방향으로 회전시키면, 2번 톱니바퀴가 반시계 방향으로 회전하게 되고, 2번이 회전하기 때문에, 3번도 동시에 시계 방향으로 회전하게 된다.
- 4번은 3번이 회전하지만, 맞닿은 극이 같기 때문에 회전하지 않는다.
- 따라서, 아래와 같은 상태가 된다.
- 톱니바퀴의 초기 상태와 톱니바퀴를 회전시킨 방법이 주어졌을 때, 최종 톱니바퀴의 상태를 구하는 프로그램을 작성하시오.
입력
- 첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다.
- 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다.
- N극은 0, S극은 1로 나타나있다.다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다.
- 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다.
- 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴의 번호, 두 번째 정수는 방향이다. 방향이 1인 경우는 시계 방향이고, -1인 경우는 반시계 방향이다.
출력
- 총 K번 회전시킨 이후에 네 톱니바퀴의 점수의 합을 출력한다. 점수란 다음과 같이 계산한다.
- 1번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 1점
- 2번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 2점
- 3번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 4점
- 4번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 8점
풀이
private class Solution14891 {
fun solution(gears: Array<IntArray>, commends: Array<Pair<Int, Int>>): Int {
for ((gearIndex, rotation) in commends) {
rotate(gearIndex - 1, rotation, gears, BooleanArray(4))
}
var result = 0
if (gears[0][0] == 1) {
result += 1
}
if (gears[1][0] == 1) {
result += 2
}
if (gears[2][0] == 1) {
result += 4
}
if (gears[3][0] == 1) {
result += 8
}
return result
}
private fun rotate(
gearIndex: Int,
rotation: Int,
gears: Array<IntArray>,
visited: BooleanArray
) {
if (visited[gearIndex]) {
return
}
visited[gearIndex] = true
if (gearIndex >= 1 && gears[gearIndex - 1][2] != gears[gearIndex][6]) {
rotate(gearIndex - 1, rotation * -1, gears, visited)
}
if (gearIndex < 3 && gears[gearIndex][2] != gears[gearIndex + 1][6]) {
rotate(gearIndex + 1, rotation * -1, gears, visited)
}
val gear = gears[gearIndex]
when(rotation) {
1 -> {
val last = gear.last()
for (i in 7 downTo 1) {
gear[i] = gear[i - 1]
}
gear[0] = last
}
-1 -> {
val first = gear.first()
for (i in 0..6) {
gear[i] = gear[i + 1]
}
gear[7] = first
}
}
}
}
private fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val gears = Array(4) {
val arr = br.readLine().toCharArray()
IntArray(8) { col -> arr[col].digitToInt() }
}
val k = br.readLine().toInt()
val commends = Array(k) {
val str = br.readLine().split(" ")
str[0].toInt() to str[1].toInt()
}
bw.append("${Solution14891().solution(gears, commends)}\n")
bw.flush()
br.close()
bw.close()
}
반응형
'Software > 백준' 카테고리의 다른 글
[백준 11727번] 2×n 타일링 2 - Kotlin (0) | 2024.05.07 |
---|---|
[백준 11866번] 요세푸스 문제 0 - Kotlin (0) | 2024.05.07 |
[백준 9461번] 파도반 수열 - Kotlin (0) | 2024.05.02 |
[백준 2294번] 동전 2 - Kotlin (0) | 2024.04.30 |
[백준 11724번] 연결 요소의 개수 - Kotlin (0) | 2024.04.30 |