알고리즘/백준[baekjoon]

[baekjoon] 백준 1107번 : 리모컨 (by python 파이썬)

코딩하는이씨 2022. 4. 13. 22:59
728x90
반응형

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

 

1107번: 리모컨

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

www.acmicpc.net

 

정답 code

target = int(input())
ans = abs(100-target) # + or -로만 이동할때 (최대값)
m = int(input())
if m: #고장난게 있을경우에만 input 실행
    b = set(input().split())
else:
    b = set()

for num in range(1000001):
    for n in str(num):
        if n in b: #눌러서 만들수 없는 숫자 포함이면 종료
            break
    else:
        #기존값과 버튼을 누르고 + - 버튼으로 간 횟수중 최솟값
        ans = min(ans, len(str(num))+abs(num - target))

print(ans)

 

이 문제를 처음 보고 들은 생각은 어떻게 하면 빠르게 풀 수 있을까였다.

시도 한방법은 몇가지 있었다.

1. 고장난 버튼 제외하고 남아있는버튼으로 target 채널근처에 먼저 맞추기

2. 고장나지 않은 버튼으로 만들수있는 채널을 target채널부터 작아지는 채널과 커지는 채널중에 가장가까운 채널 찾기

.

.

.

 

하지만 간단히 완전탐색으로 풀 수 있는 문제였다.

 

solution

1.타겟 채널입력

2.정답을 넣을 변수ans 에 + - 버튼으로만 이동하는 횟수 입력

3.m 입력후 값이 있다면 input통해 고장난 값 입력

4.완전탐색으로 채널 하나하나 마다 탐색하여 고장난 버튼으로 이루어진 채널이 아니라면,

  원래의 경우의수와 숫자버튼을 누르고 남은 차이만큼을 비교하여 최솟값을 ans에 저장

5.ans 출력

728x90
반응형