BOJ 1107번 리모컨 파이썬

자기개발자·2022년 4월 3일

1107번 리모컨 파이썬

문제

수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장났다.

리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대 만큼 있다.

수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야하는지 구하는 프로그램을 작성하시오.

수빈이가 지금 보고 있는 채널은 100번이다.

입력

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

출력

첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.


스스로 풀지 못했고, 블로그 서칭 후 어떻게 풀어야 되는지 이해만 한 상태이기 때문에 여기 코드를 적지 않음

이후 다시 풀어볼 예정

참고한 블로그:

[백준] 1107번 리모컨 - 파이썬(Python)

내가 이해한 내용을 토대로 정리해보자면:

브루트포스 방식으로 모든 경우의 수를 탐색

유의할 점은 N이 가질 수 있는 최댓값인 500,000이 아니라 1,000,000을 범위로 탐색함. (이유는 아래 A-2-2를 설명하면서 나옴)

A: N까지 도달하는 2가지 경우의 수

  • A-1: +,-만 사용하는 경우
  • A-2: 일단 숫자 버튼으로 N과 근접한 숫자로 이동한 후에, 남은 숫자를 +,-를 눌러서 이동하는 경우 (물론 +,-를 사용할 일 없을 수도 있음)

최적의 해를 보장하기 위해서는, 사전에 계산해둘 수 있는 값인 A-1을 미리 계산해두고, 만약 A-2도 계산해서 나올 수 있다면, 이 둘을 min으로 비교해서 최소값을 반환한다.

A-2를 사용할 때도, 어떤 버튼이 고장났느냐에 따라서 2가지 경우의 수가 갈림

  • A-2-1: N보다 낮은 번호로 이동해서 + 버튼을 누르는 경우
  • A-2-2: N보다 높은 번호로 이동해서 - 버튼을 누르는 경우

비록 N은 범위가 500,000까지이지만, 위에서 A-2-2 를 감안해서 500,000보다 높은 수로 이동하는 것도 감안해야 하는데, 문제에서 언급하기를 채널의 양은 무한대이기 때문에 range를 1,000,000으로 설정한다.


처음에 틀렸던 이유:

  • permutations를 사용하려고 했었는데, 요소를 중복해서도 뽑아낼 수 있어야 하기 때문에 사용 불가
  • 빅오에 대한 개념이 빈약해서, 작성하는 알고리즘으로 풀 수 있는지 확신이 없음. 만약 브루트포스로도 가능하다는 확신이 섰다면 그 방식을 택했을텐데.
profile
Self Refiner

0개의 댓글