[Swift] 백준 1107 - 리모컨
어려웠다 .....
다른 사람 풀이 무진장 많이 봤다...😇
고장나지 않은 버튼을 사용해서 누를 수 있는 채널 중
이동하려는 채널과 가장 가까운 채널을 찾아 이동하는 횟수를 구해주어야한다.
예를 들어 이동하려는 채널이 5457이고 고장난 버튼이 [6,7,8] 이라면
- 0부터 5456사이에서 고장난 버튼을 사용하지 않고 누를 수 있는 채널 중 5457과 가장 가까운 채널 => 5455
- 5455에서 5457으로 이동하기 위해 눌러야하는 횟수 = (5457 - 5455) + 4(5,4,5,5) => 6
- 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프로...
Author And Source
이 문제에 관하여([Swift] 백준 1107 - 리모컨), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sun02/Swift-백준-1107-리모컨저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)