안녕지구 #developer #bompapa

BOJ - 리모컨(1107)

|

브루트포스로 풀 수 있는 문제입니다. 모든 채널을 돌면서 리모컨으로 가능한 채널을 찾습니다. 가능한 채널로부터 +/- 버튼을 몇 번 눌러야 하는지 계산하면서 가장 적은 누르는 수를 찾습니다. 일단 가능한 채널로 이동 후 +/- 버튼 누르는 동작을 수행한다고 생각하면 문제에 간단하게 접근할 수 있습니다.

풀이 코드

#include <stdio.h>
int N, M;
bool broken[10];

// number가 누를 수 있는 수인지 확인합니다.
int is_possible(int number) {
	int ret = 0;

	// 0번일 때는 별도로 처리가 필요합니다.
	if (number == 0) {
		if (broken[number] == 1) {
			return 0;
		} else {
			return 1;
		}
	}

	while (number > 0) {

		if (broken[number % 10]) {
			return 0;
		}

		number = number / 10;
		ret += 1;
	}
	return ret;
}

int main() {
	scanf("%d %d", &N, &M);
	for (int i = 0; i < M; i++) {
		int number;
		scanf("%d", &number);
		broken[number] = true;
	}

	// 초기 [+/-] 누르는 수 계산
	int ans = 100 - N;
	if (ans < 0) {
		ans = ans * -1;
	}

	for (int ch = 0; ch <= 1000000; ch++) {
		int len = is_possible(ch);
		if (len > 0) {

			// [+/-] 누르는 수 계산
			int count = ch - N;
			if (count < 0) {
				count = count * -1;
			}

			// 가능한 숫자로 채널 이동 수 + [+/-] 누르는 수
			if (ans > len + count) {
				ans = len + count;
			}
		}
	}

	printf("%d", ans);

	return 0;
}

Comments