[Swift] 백준 1107 - 리모컨

sun02·2022년 1월 6일
0

알고리즘

목록 보기
34/52


문제 바로가기

어려웠다 .....
다른 사람 풀이 무진장 많이 봤다...😇

고장나지 않은 버튼을 사용해서 누를 수 있는 채널 중
이동하려는 채널과 가장 가까운 채널을 찾아 이동하는 횟수를 구해주어야한다.

예를 들어 이동하려는 채널이 5457이고 고장난 버튼이 [6,7,8] 이라면

  1. 0부터 5456사이에서 고장난 버튼을 사용하지 않고 누를 수 있는 채널 중 5457과 가장 가까운 채널 => 5455
    • 5455에서 5457으로 이동하기 위해 눌러야하는 횟수 = (5457 - 5455) + 4(5,4,5,5) => 6
  1. 5457 ~ 999999 사이에서 고장난 버튼을 사용하지 않고 누를 수 있는 채널 중 5457과 가장 가까운 채널 => 5459
    (이동할 수 있는 채널의 최대가 500,000이기 때문에 999999까지 고려해야한다)
    • 5459에서 5457으로 이동하기 위해 눌러야하는 횟수 = (5458 - 5457) + 4(5,4,5,8) => 6

따라서, 이동하는 최솟값은 두 가지 경우 중 최솟값이고 이 경우는 6이다.

최종 풀이

import Foundation

let channel = Int(readLine()!)!
let NumOfWrongButton = Int(readLine()!)!

var wrongButtons = [Int]()

if NumOfWrongButton != 0 {
    wrongButtons = readLine()!.split(separator: " ").map { Int(String($0))! }
    getNum()
} else {
    let a = String(channel).count
    let b = abs(100 - channel)     
    a < b ? print(a) : print(b)
}

func getNum() {
    var buttons = Array(repeating: false, count: 10)
    for i in wrongButtons {
        buttons[i] = true
    }
    
    var max = -1
    var min = -1
    
    for i in (0...channel).reversed() {
        var mode = true
        var N = i
        while N >= 0 {
            if buttons[N % 10] {
                mode = false
                break
            } else {
                N = N / 10
            }
            if N == 0 {
                break
            }
        }
        
        if mode {
            max = N
            break
        }
    }
    
    for i in channel...1000000 {
        var mode = true
        var N = i
        while N >= 0 {
            if buttons[N % 10] {
                mode = false
                break
            } else {
                N = N / 10
            }
            if N == 0 {
                break
            }
        }
        
        if mode {
            min = i
            break
        }
    }
    
    if max == -1 {
        max = 1000000
    } else {
        max = channel - max + String(max).count
    }
    
    if min == -1 {
        min = 1000000
    } else {
        min = abs(channel - min) + String(min).count
    }
    
    let mid = abs(100-channel)
    
    print([max,min,mid].min()!)
}

통과한 뒤에
진짜진짜 멋있는 다른 분의 풀이를 봐서 참고하여 수정한 풀이입니당
제 지분은,한 2프로...

0개의 댓글