๋ฐฑ์ค€ - ํ†ฑ๋‹ˆ๋ฐ”ํ€ด 2(Swift)

2022. 11. 21. 14:53ใ†Algorithm

๋ฐฑ์ค€ - ํ†ฑ๋‹ˆ๋ฐ”ํ€ด 2(Swift)

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

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

 

15662๋ฒˆ: ํ†ฑ๋‹ˆ๋ฐ”ํ€ด (2)

์ด 8๊ฐœ์˜ ํ†ฑ๋‹ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ†ฑ๋‹ˆ๋ฐ”ํ€ด T๊ฐœ๊ฐ€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ผ๋ ฌ๋กœ ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ๋˜, ํ†ฑ๋‹ˆ๋Š” N๊ทน ๋˜๋Š” S๊ทน ์ค‘ ํ•˜๋‚˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋‹ค. ํ†ฑ๋‹ˆ๋ฐ”ํ€ด์—๋Š” ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋Š”๋ฐ, ๊ฐ€์žฅ ์™ผ์ชฝ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด

www.acmicpc.net

 

 ๋‚˜์˜ ํ’€์ด

 

๋ณดํ†ต ๋ฌธ์ œ๊ฐ€ ๊ต‰์žฅํžˆ ๊ธธ๋ฉด์„œ ์ž…๋ ฅ๊ฐ’์ด 1000์ดํ•˜๋ผ๋ฉด ๊ตฌํ˜„๋ฌธ์ œ๋‹ค.

 

์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ ์€ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๊ฐ€ ๋งž๋ฌผ๋ฆฌ๋Š” ํƒ€์ด๋ฐ์ด๋‹ค. ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๊ฐ€ ๋งž๋ฌผ๋ฆฌ๋Š” ๊ณต๊ฐ„์€ ์ธ๋ฑ์Šค2์™€ 6์ด๋‹ค.

์˜ˆ์‹œ๋กœ 4๊ฐœ์˜ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

2๋ฒˆ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋ฅผ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋ฆด๋•Œ ์–‘์ชฝ์˜ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๋ž‘ ๋งž๋ฌผ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ํ™•์ธํ•ด์•ผํ•œ๋‹ค. ์ฆ‰ 1๋ฒˆ์˜ 6๋ฒˆ์ธ๋ฑ์Šค์™€ 3๋ฒˆ์˜ 2๋ฒˆ์ธ๋ฑ์Šค๋ฅผ ํ™•์ธํ•ด์„œ ์„œ๋กœ ๊ทน์ด ๋‹ค๋ฅด๋‹ค๋ฉด ์žฌ๊ท€๋ฅผ ๋Œ๊ณ  ์•„๋‹ˆ๋ผ๋ฉด ๋„˜๊ธฐ๋ฉด ๋œ๋‹ค. 

 

ํ’€์ด๊ฐ€ ์กฐ๊ธˆ ์˜ค๋ž˜๊ฑธ๋ ธ๋˜ ์ด์œ ๋Š” ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋•Œ ๋งจ๋งˆ์ง€๋ง‰๊ฐ’์„ ์ฒซ๋ฒˆ์งธ์— ๋„ฃ์–ด์•ผํ•˜๋Š”๋ฐ ์ด ๋ถ€๋ถ„์„ ๋ฐ˜๋Œ€๋กœํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ• ๋•Œ ์ธ๋ฑ์Šค๊ฐ€ ๋„˜์–ด๊ฐ„์ƒํƒœ์—์„œ ๋ฐฐ์—ด์„ ์„œ๋ธŒ์Šคํฌ๋ฆฝํŒ…ํ•˜๋‹ค๋ณด๋‹ˆ ๋Ÿฐํƒ€์ž„์—๋Ÿฌ๊ฐ€ ๋‚˜์™”์—ˆ๋Š”๋ฐ ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ํ•˜๊ธฐ์ „์— ์ˆซ์ž์˜ ์œ ํšจ์„ฑ์„ ๋จผ์ € ์ฒดํฌํ•˜๋‹ˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

import Foundation

struct Wheel {
    var wheel: [Int]

    init(wheel: [Int]) {
        self.wheel = wheel
    }
}


let T = Int(readLine()!)!
var wheels = [Wheel]()
var visited = [Bool](repeating: false, count: T+1)
for i in 0..<T {
    let wheel = Wheel(wheel: readLine()!.map{Int(String($0))!})
    wheels.append(wheel)
}

let K = Int(readLine()!)!
for _ in 0..<K {
    visited = [Bool](repeating: false, count: T+1)
    let input = readLine()!.components(separatedBy:" ").map{Int($0)!}
    let target = input[0], dir = input[1] 
    rotate(num: target, dir: dir)
}
var cnt = 0
wheels.forEach { 
    if $0.wheel[0] == 1 {
        cnt += 1
    }
}
print(cnt)

func rotate(num: Int, dir: Int) {
    visited[num] = true
    // 0๋ณด๋‹ค ํฌ๋ฉด์„œ ๋ฐฉ๋ฌธ๋˜์ง€ ์•Š์•˜์„ ๋•Œ
    if 0<num-1, !visited[num-1] {
    	// ๋ฐ”ํ€ด๊ฐ€ ๋งž๋ฌผ๋ฆด ๋•Œ
        if wheels[num-2].wheel[2] != wheels[num-1].wheel[6] {
            if dir == 1 { rotate(num: num-1, dir: -1)} 
            else { rotate(num: num-1, dir: 1)}
        }
    }
    if num+1<T+1, !visited[num+1] {
        if wheels[num].wheel[6] != wheels[num-1].wheel[2] {
            if dir == 1 { rotate(num: num+1, dir: -1) }
            else { rotate(num: num+1, dir: 1)}
        }
    }
    
    if dir == 1 { // ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „
        let tmp = wheels[num-1].wheel.removeLast()
        wheels[num-1].wheel.insert(tmp, at: 0)
    } else {
        wheels[num-1].wheel.append(wheels[num-1].wheel.removeFirst())
    }
}