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

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

구현 문제다. 톱니의 회전은 간단하게 구현이 가능하지만 문제는 회전하기 전 각 극성을 확인하여 주변 톱니바퀴를 회전해야 할지 회전하지 말아야 할지, 회전한다면 시계방향인지, 반시계 반향인지에 대해 오래 고민했던 문제다.

 

풀이

처음에는 재귀 호출 방식으로 구현하여 톱니가 회전하게 되면 양 측면의 톱니를 회전할지 말지를 확인 후 재귀 호출하는 방법으로 접근했었다. 하지만 그렇게 접근하게 되면 생각해야 할 조건이 너무 많아지게 된다. 따라서 톱니의 번호와 방향이 입력되면, 4개의 톱니의 회전 방향을 결정하고 난 후 한 번에 처리하는 방법으로 코드를 작성하였다.

톱니의 회전방향을 담아낼 progress: Array(repeating: 0 , count: 4) 배열을 생성한 후 해당 원소가 0이면 회전하지 않고, -1이면 반시계, 1이면 시계방향으로 회전하게 된다. 회전 방향과 톱니의 번호가 입력되면 다음과 같은 동작을 수행한다.

  1. 입력된 번호에 해당하는 progress 배열 원소에 입력된 방향 담기
  2. 입력된 번호부터 0까지 감소하면서 톱니의 맞닿은 부분의 조건 확인
  3. 조건이 맞다면 기존 방향을 뒤집어가며 해당 인덱스의 progess 원소에 방향 담기
  4. 입력된 톱니번호부터 마지막 톱니 번호까지 증가하면서 톱니의 맞닿은 부분의 조건 확인
  5. 조건이 맞다면 기존방향을 뒤집어가며 해당 인덱스의 progess 원소에 방향 담기

중간에 조건이 맞지 않는다면 반복문은 바로 탈출한다. 이후 마지막에 일괄로 톱니의 회전을 처리하면 된다.

 

정답 코드

import Foundation
var gears = [[Int]]()
for _ in 0..<4{
gears.append(readLine()!.map{Int(String($0))!})
}
func rotate(dir:Int, idx:Int){
if dir<0{
let temp = gears[idx].first!
for i in stride(from: 0, through: 6, by: +1){
gears[idx][i] = gears[idx][i+1]
}
gears[idx][7] = temp
}else if dir > 0{
let temp = gears[idx].last!
for i in stride(from: 7, through: 1, by: -1){
gears[idx][i] = gears[idx][i-1]
}
gears[idx][0] = temp
}
}
let k = Int(readLine()!)!
for _ in 0..<k{
let line = readLine()!.split(separator: " ").map{Int($0)!}
let idx = line[0]-1
var dir = line[1]
var progress = Array(repeating: 0, count: 4)
progress[idx] = dir
for idx in stride(from: idx-1, through: 0, by: -1){
if gears[idx][2] != gears[idx+1][6]{
dir *= -1
}else{
break
}
progress[idx] = dir
}
dir = line[1]
for idx in idx+1..<4{
if gears[idx][6] != gears[idx-1][2]{
dir *= -1
}else{
break
}
progress[idx] = dir
}
for i in 0..<4{
rotate(dir: progress[i], idx: i)
}
}
let ans = gears[0][0] + (gears[1][0]*2) + (gears[2][0]*4) + (gears[3][0]*8)
print(ans)
view raw 14891.swift hosted with ❤ by GitHub

'Problem Solving > BOJ' 카테고리의 다른 글

[14499] 주사위 굴리기  (0) 2022.11.10
[21608] 상어 초등학교  (0) 2022.11.09
[13335] 트럭  (0) 2022.11.07
[1245] 농장 관리  (0) 2022.11.04
[1148] 단어 만들기  (0) 2022.11.03

+ Recent posts