리모컨
Coding/PS

리모컨

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

#include 
#include 
#include 

using namespace std;

vector isBroken(10, false); // 고장난 버튼을 알려주는 벡터

// 누를 수 있는 숫자인지 알려주는 함수
int canPush(int num) {
	int push = 0;
	
	while(true)
	{
		if (isBroken[num%10] == true) return 0;
		else {
			num /= 10;
			push++;
		}
		
		if (num == 0) return push;
	}
}

int main ()
{	
	int answer=0; // 몇번 버튼을 눌렀는지 저장하는 변수
	int N, M, temp; // N = 이동하려는 채널, M = 고장난 버튼
	int hi,lo; // hi = 누를 수 있는 숫자 중 N에서 가장 가까운 큰 수, lo = 작은 수
	int button_100; // 100에서 +,-로만 수에 도달했을 때의 버튼 눌리는 수.
	
	// 입력을 받는다.
	cin >> N >> M;
	
	for (int i = 0; i < M; i++)
	{
		cin >> temp;
		isBroken[temp] = true;
	}
	
	// 이동하려는 채널에서
	// 아래로 내려가면서 누를 수 있는 수를 찾는다.
	temp = N;
	while (true)
	{
		// 범위를 벗어나지 않게끔한다.
		if (temp < 0) {lo = 1000000; break;}
		
		if (canPush(temp) != 0) { lo = canPush(temp)+(N-temp); break; }
		else temp--;
	}
	
	// 이동하려는 채널에서
	// 위로 가면서 누를 수 있는 수를 찾는다.
	temp = N+1;
	while (true)
	{
		// 범위를 벗어나지 않게끔한다.
		if (temp >= 1000000) {hi=1000000; break;}
		
		if (canPush(temp) != 0) { hi = canPush(temp)+(temp-N); break; }
		else temp++;
	}
	
	// 100에서 출발할 경우를 생각해본다.
	if (N-100 > 0) button_100 = N-100;
	else button_100 = 100-N;
	
	// hi 와 lo 와 100출발 을 비교한다.
	if (hi <= lo && hi <= button_100) cout << hi << endl;// hi가 최소인 경우
	else if (hi > lo && lo < button_100) cout << lo << endl; // lo가 최소인 경우
	else cout << button_100 << endl; // 100에서 출발이 최소인 경우
	
}

'Coding > PS' 카테고리의 다른 글

[백준 2193] 이친수  (0) 2019.09.27
영화감독 숌  (0) 2019.07.06
덩치  (0) 2019.07.06
분해합  (0) 2019.07.05
카드의 합 구하기  (0) 2019.07.05