알고리즘/백준

1107번 리모컨 백준

글을 쓰는 개발자 2020. 12. 5. 19:04
반응형

문제:www.acmicpc.net/problem/1107

 

1107번: 리모컨

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

www.acmicpc.net

이 문제를 처음에 봤을 때 lower_bound 와 upper_bound의 관계를 이용하면 되지 않을까 하고 이에 대하여 코딩을 짰었는데 100과 가까운 숫자에 대하여 어떻게 처리해야 할지 감이 안왔다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
 
def solve(sub):
    global ans
    for p in possible:
        now = sub + str(p)
        ans = min( ans, len(str(int(now))) + abs(n-int(now)) )
        if len(now) < 6:
            solve(now)
    
= int(input())
= int(input())
ans = abs(n-100)
 
possible = set()
if m:
    broken = set(map(int, sys.stdin.readline().split()))
    possible = set(i for i in range(10)).difference(broken)
else:
    ans = min(ans, len(str(n)))
 
solve('')
print(ans)
cs

참고:https://suri78.tistory.com/150

 

[백준알고리즘] 1107번: 리모컨 -Python

[백준알고리즘] 1107번: 리모컨 -Python https://www.acmicpc.net/problem/1107 1107번: 리모컨 첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다.  둘째 줄에는 고장난 버튼의 개..

suri78.tistory.com

우선 if문은 사용 가능한 버튼을 저장하는 possible을 설정하였고 else문을 통해 고장나지 않았을 때에는 찾고자 하는 숫자에서 100을 뺀 값과 순전히 버튼을 눌렀을 때의 크기를 비교한다. 그리고 solve 함수를 통해 결과를 낸다.

solve함수를 해석하자면 우선 버튼을 누를 수 있는 숫자에 대하여 최대길이까지 브루트 포스 알고리즘을 적용한다.

ans = min( ans, len(str(int(now))) + abs(n-int(now)) )숫자길이 + ( + 또는 - 의 누르는 갯수)를 의미한다.

 

 

1
2
3
5457
3
6 7 8
cs

첫 번째 예시로 설명 해보면 리모컨이 가능한 숫자는 [0,1,2,3,4,5,9]이다. 여기서 solve는 0 ->000000까지 간다음 000001 -> 999999 까지 이렇게 완전탐색을 한다. 그러면서 ans의 최솟값을 갱신하면서 값을 찾아내는 형식이다.

반응형