1107 리모컨
본문 바로가기
알고리즘 모음집/New 알고리즘

1107 리모컨

by KyeongMin 2021. 2. 18.
728x90
반응형

www.acmicpc.net/problem/1107

 

1107번: 리모컨

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

www.acmicpc.net

#include<stdio.h>
#include<string>
using namespace std;
int numAble[10] = { 1,1,1,1,1,1,1,1,1,1};// 정상인 버튼 1, 비정상 버튼 0 표시
bool chkNum(int num) {// 번호 리모컨으로 누를 수 있는 번호 인지 확인 // 좀 느림
	string s = to_string(num);
	if (num == 0) {
		if (numAble[0] == 0) {
			return 0;
		}
		else {
			return 1;
		}
	}
	int cnt = 0;
	for (int si = 0; si < s.size(); si++) {
			if (numAble[s[si] - '0']==0) {
				return false;
			}
	}
	return true;// 가능 한 숫자라면 1 반환
}
int chkNum1(int c) {//엄청나게 빠름 
	if (c == 0) {
		if (numAble[0]==0) {
			return 0;
		}
		else {
			return 1;
		}
	}
	int len = 0;
	while (c > 0) {
		if (numAble[c % 10]==0) {
			return 0;
		}
		len += 1;
		c /= 10;
	}
	return 1;
}
int main(void) {
	int num = 0;// 목표 채널
	scanf("%d", &num);
	int M = 0;//고장난 버튼의 개수
	scanf("%d", &M);
	for (int m = 0; m < M; m++) {//버튼 고장 난것 0으로 표시
		int breakNum = 0;//고장 버튼 숫자
		scanf("%d", &breakNum);
		numAble[breakNum] = 0;// 고장 표시 
	}
	int min = 0x7fffffff;// 최소 누르는 횟수 저장 변수
	int absNum = 0;
	if (num == 100) {//100 채널에서 부터 시작이니까.	
		printf("%d", 0);
		return 0;
	}
	int a = abs(num - 100);
	absNum = a;
	min = min > absNum ? absNum : min;//최소값 저장
	for (int i = 0; i <= 1000000; i++) {// 번호 검색 

		 if (chkNum1(i)) {//가능한 번호라면 목표 번호까지 몇번 더 누르는지 확인
			 int a = to_string(i).size();
			 a = a + abs(num - i);
			min = min > a ? a : min;//최소값 저장
		}
	}
	printf("%d", min);
	return 0;
}

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

1018 체스판 다시 칠하기  (0) 2021.02.20
3085 사탕게임  (0) 2021.02.19
14502 연구소  (0) 2021.01.12
15686 치킨배달  (0) 2021.01.10
14500 테트로미노  (0) 2021.01.10

댓글