반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

[Swift][백준 알고리즘] 1107 리모컨 본문

오뚝이 개발자/알고리즘

[Swift][백준 알고리즘] 1107 리모컨

rriver2 2022. 4. 13. 16:48
반응형

[백준 알고리즘] 1107 리모컨

문제:    

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

 

1107번: 리모컨

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼

www.acmicpc.net

풀이방법:    

1) 현재 번호 100에서 ( +,- 클릭 횟수 )

2) 가고 싶은 채널 근처에서 가려는 채널로 가기 ( 채널 번호 클릭 횟수 & +,- 클릭 횟수 )

 

  Tips   2)을 구할 때 0 ~ 500000가 아니라 0 ~ 1000000까지 고려해야 함

수빈이가 원하는 최대 채널은 500000이지만, 티비 채널은 무한대로 존재

예를 들어 수빈이는 499999에 가고 싶은데, 9가 제한되어 있으면

488888에서 올라가는 것보다 500001에서 한 칸 내려가는 게 나음

그래서 0에서 500000까지 뿐만이 아니라 500001에서 1000000까지도 고려해야 함

 

작성한 코드는 다음과 같다. 

import Foundation


var remoteNumber = Int(String(readLine()!))!
let n = Int(String(readLine()!))!
var cantPushNumber: [Int] = []
if n != 0 {
    cantPushNumber = readLine()!.split(separator: " ").map{Int(String($0))!}
}
//0부터 1000000까지의 모든 채널을 다 이동해보면서 n까지 가장 조금이동해서 도달할수있는 경우를 저장하고 출력.


// 1) + 또는 -만 눌렀을 때 나올 수 있는 결과의 최대값
// abs : 절댓값 구하는 함수
var minCnt = abs(remoteNumber - 100)


// 수빈이가 원하는 최대 채널은 500000이지만, 티비 채널은 무한대로 존재
// 만약 499999에 가고 싶은데, 9가 제한되어 있으면
// 488888에서 올라가는 것보다 500001에서 한 칸 내려가는 게 나음
// 그래서 0에서 500000까지 뿐만이 아니라 500001에서 1000000까지도 고려해야 함
for i in 0...1000000 {
    
    //채널 번호 클릭 횟수 구하기
    let len = check(i)
    
    // 채널에 누를 수 없는 숫자가 포함되어 있지 않으면 ( 0 이 아니면 )
    if len > 0 {
        
        // 2) 누른 채널과 가려고 하는 채널 차이값 + 채널 번호 클릭 횟수
        let press = abs(remoteNumber - i) + len
        
        // 1) 과 2) 중에 작은 거 추출
        minCnt = min(minCnt, press)
    }
}

print(minCnt)
 
//채널 번호 클릭 횟수
func check(_ i: Int) -> Int{
    
    var remoteNumber = i
        //누른 번호가 0 일 때
        if remoteNumber == 0 {
            if cantPushNumber.contains(0) {
                return 0
            }else{
                return 1
            }
        }
        
        var len = 0
       
        while remoteNumber > 0 {
            // 채널에 누를 수 없는 숫자가 포함되어 있으면
            if cantPushNumber.contains(remoteNumber % 10) {
                return 0
            }
            // 채널에 누를 수 없는 숫자가 포함되어 있지 않으면 누른 횟수 증가
            remoteNumber = remoteNumber / 10
            len += 1
        }
    
    return len
}

 

성공한 사진!    

 

  MEMO 

BruteForce는 왜케 해도해도 매번 생각하지 못한 부분이 존재하는 걸까? 멀리,, 너 자세히 바라볼 수 있는 눈을 가지자 ! 오늘도 화이팅구리 ~~~

반응형
Comments