문제

[백준] 리모컨 (Gold 5)

요약

  • 이동하고픈 채널의 번호가 주어진다.
  • + 버튼을 이용해 채널을 +1, - 버튼을 이용해 채널을 -1, 0~9의 숫자 버튼
  • 망가진 버튼은 누를 수 없다.
  • 망가진 버튼을 누르지 않고, 이동하고픈 채널로 이동할 때 최소 몇 번 눌러야 하는가?

분류

  • 브루트포스
  • 구현?

풀이

1. 구현… 일일이 경우 따져서 구해봤다. (실패)

  • 아래는 내가 나름 생각해낸 경우이다.
    1. 가고자 하는 번호가 망가진 번호에 포함되지 않는 경우
      • 번호를 눌러서 간다.
      • + or - 를 눌러서 간다.
    2. 가고자 하는 번호에 망가진 번호가 포함
      • 주변으로 가서 + or - 를 누른다.
        1. 첫 자리를 최대한 가깝게 만든다.
        2. 차를 구하여 더한다.
    3. 가고자 하는 번호 == 지금 번호(100)

일일이 케이스 나눠서 구현하다가 포기했다.


<포기한 코드 : 안 돌아갑니다.>

  • 고려하지 못 한 것 : 주어진 수로 가장 가까운 수를 구하는 것이 너무 까다롭다. 구현하다가 뇌정지와서 포기함.
n = int(input())
m = int(input())
arr = list(map(int, input().split())) if m != 0 else []

def most_closest(target, nums, isSmall):
  dif = 100
  for num in nums:
    dif = min(dif, abs(target - num))
  answer = abs(target - dif) if not isSmall else max(nums)
  return str(answer)


if n == 100 :
  print(0)
elif all([i != j for i in map(int, list(str(n))) for j in arr]):
  print(min(len(str(n)), abs(100 - n)))
else:
  if m == 10: print(abs(100 - n))
  else:
    nums = [i for i in range(10) if i not in arr]
    closest = []
    for t in list(str(n)):
      closest.append(most_closest(int(t), nums, int(str(n)[0]) > nums[-1]))
    print(abs(n - int(''.join(closest))) + len(closest))

2. 브루트포스

  • 백준 알고리즘 분류를 열어보니, 브루트포스 알고리즘이라고 해서…. 그냥 허무한 마음으로 코드나 적었다. 허허
n = int(input())
m = int(input())
arr = list(map(int, input().split())) if m != 0 else []

def closest_channel(target, broken):
    min_presses = abs(target - 100)

    for channel in range(1000001):
        valid = True
        for digit in str(channel):
            if int(digit) in broken:
                valid = False
                break
        if valid:
            min_presses = min(min_presses, abs(target - channel) + len(str(channel)))

    return min_presses

if n == 100:
    print(0)
else:
    result = closest_channel(n, arr)
    print(result)