나의 브을로오그으

[c++] 1107번 : 리모컨 본문

알고리즘/BaekJoon

[c++] 1107번 : 리모컨

__jhp_+ 2022. 5. 30. 13:30

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

 

1107번: 리모컨

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

www.acmicpc.net

#include <iostream>

using namespace std;

#define MIN			0
#define MAX			500000

int Abs(int n)
{
	return n < 0 ? ~n + 1 : n;
}

int CountOfInputNumber(int* bkNums, int N)
{
	if (N <= 0)
	{
		return bkNums[0] == 0 && N == 0 ? 1 : -1;
	}

	int cnt = 0;
	while (N > 0)
	{
		int btn = N % 10;
		for (int i = 0; i < 10; ++i)
		{
			if (bkNums[i] > 0 && btn == i)
			{
				return -1;
			}
		}
		N /= 10;
		++cnt;
	}
	return cnt;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int N, M;
	int bkNums[10] = { 0, };
	int signs[2] = { -1, +1 };
	int num, cur = 100, cnt = 0;

	cin >> N;
	cin >> M;
	for (int i = 0; i < M; ++i)
	{
		cin >> num;
		++bkNums[num];
	}

	int offset = 0;
	while (N - offset >= MIN || N + offset <= MAX)
	{
		for (int i = 0; i < 2; ++i)
		{
			cnt = CountOfInputNumber(bkNums, N + (signs[i] * offset));
			if (cnt != -1)
			{
				cnt += offset;
				break;
			}
		}
		if (cnt != -1) break;
		++offset;
	}

	int moveCnt = Abs(cur - N);
	if (cnt == -1 || moveCnt < cnt) 
		cnt = moveCnt;

	cout << cnt << '\n';

	return 0;
}

'알고리즘 > BaekJoon' 카테고리의 다른 글

[c++] 1389번 : 케빈 베이컨의 6단계 법칙  (0) 2022.06.02
[c++] 1260번 : DFS와 BFS  (0) 2022.05.31
[c++] 1074번 : Z  (0) 2022.05.20
[c++] 1012번 : 유기농 배추  (0) 2022.05.18
[c++] 1003번 : 피보나치 함수  (0) 2022.05.18