ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 1107] 리모컨
    알고리즘/백준 2019. 3. 29. 03:06

    생각보다 정답률이 낮아 깜짝 놀랐지만,

    문제 풀면서.. 왜 낮은지 이해가 된 문제

    중간에 오답이 떠서 헤맨 문제입니다.

     

    ...더보기

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

     

    1107번: 리모컨

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

    www.acmicpc.net

    문제

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

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

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

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

    입력

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

    출력

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

    예제 입력 1

    5457 3 6 7 8

    예제 출력 1

    6

    예제 입력 2

    100 5 0 1 2 3 4

    예제 출력 2

    0

    예제 입력 3

    500000 8 0 2 3 4 6 7 8 9

    예제 출력 3

    11117

     

     

    소스코드

    #include<iostream>
    
    using namespace std;
    
    bool broken[10]; 
    
    int possible(int c){
    	if(c == 0){
    		if(broken[0])
    			return 0;
    		else
    			return 1;
    	}
    	int len = 0;
    	while(c > 0){
    		if(broken[c % 10]){
    			return 0;
    		}
    		len += 1;
    		c /= 10;
    	}
    	return len;
    }
    
    int main(){
    	int n,b;
    	cin >> n >> b;				// 이동할 채널
    	
    	for(int i = 0; i < b; i++){
    		int tmp;
    		cin >> tmp;				
    		broken[tmp] = true;		// 고장난 채널		
    	}
    	int ans = n - 100;
    	if(ans < 0){							// 이동할 채널이 100 미만 
    		ans = -ans;
    	}
    	for(int i = 0; i <= 1000000; i++){
    		int c = i;
    		int len = possible(c);
    		if(len > 0){
    			int press = c - n;
    			if(press < 0){
    				press = -press;
    			}
    			if(ans > len + press){
    				ans = len + press;
    			}
    		}
    	}
    	cout << ans;	
    	
    	return 0;
    }

     

    ※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다.

    반응형

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

    [백준 10971] 외판원 순회2  (0) 2019.04.17
    [백준 10819] 차이를 최대로  (0) 2019.04.16
    [백준 1476] 날짜 계산  (0) 2019.03.29
    [백준 1517] 버블 소트  (0) 2019.03.21
Designed by Tistory.