작심삼일

[백준] 1107번 | 리모컨 | c++ 본문

스터디/코테

[백준] 1107번 | 리모컨 | c++

yun_s 2021. 11. 8. 10:24
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/1107


문제

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

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

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

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


입력

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


출력

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


내 풀이

현재 채널과 목표 채널사이의 거리를 계산한 후, 이를 이용해 모든 경우에 대해서 계산해본다.


코드

#include <iostream>
#define len 5000001
int N, dest, no[10], cur = 100, min, output;
int remain;

int getDist(int number) {
	return (dest > number) ? dest - number : number - dest;
}

int Length(int number) {
	if (number == 0) return 1;

	output = 0;
	while (number) {
		number /= 10;
		output++;
	}

	return output;
}

int ifPossible(int number) {
	if (number == 0) {
		for (int n = 0; n < N; n++) {
			if (remain == no[n])	return 1;
		}
	}

	while (number) {
		remain = number % 10;
		for (int n = 0; n < N; n++) {
			if (remain == no[n])	return 1;
		}
		number /= 10;
	}

	return 0;
}

int tryAll() {
	for (int m = 0; m < len; m++) {
		if (!ifPossible(m)) {
			output = getDist(m) + Length(m);
			if (min > output) {
				int a = 1;
				a++;
			}
			min = (min < output) ? min : output;
		}
	}

	return 0;
}

int main() {
	scanf("%d", &dest);
	scanf("%d", &N);
	for (int n = 0; n < N; n++) {
		scanf("%d", &no[n]);
	}

	if (dest == cur) {
		printf("0");
		return 0;
	}

	min = getDist(cur);
	tryAll();

	printf("%d", min);

	return 0;
}

 

728x90
반응형
Comments