ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1107 (리모컨) c++
    백준 문제 2022. 8. 9. 20:28
    728x90

    문제

     

    1107번: 리모컨

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

    www.acmicpc.net

    현재 채널은 100번입니다. 여기서 n번의 채널로 이동하려 할떄 최소로 버튼을 누르는 횟수를 구하는 문제입니다.

    여기서 m개의 고장난 번호가 주어지는 데 고장난 번호는 누를 수 없습니다. 

    만약 고장난 번호로 이동하려면 '+' 번호나 '-' 를 눌러 +1 또는 -1로 이동가능합니다.

    예를 들어 n = 5457 이고 3개의 고장난 번호는 6, 7, 8 이라면 

    처음에 5455 총 4번의 버튼을 눌러 5455번 채널로 이동해 + 버튼을 2번 눌러 5457번으로 이동 가능합니다.

     

    여기서 제가 찾아낸 단서는

    1) 일단 고장나지 않은 번호를 사용해 n과 최대한으로 가까이 만들어야 합니다.

    그 다음 '+' 나 '-' 둘중 하나를 선택해 n을 만들어야 합니다.

    2) 100번 부터 시작하므로 abs(n - 100) 과 1)과 비교해야 합니다.

     

    bruteforce를 진행합니다.

    for (int i = 0; i < m; i++) {
    		int a;
    		cin >> a;
    		chk[a] = true;
    	}

    먼저 chk 배열을 통해 고장난 번호를 체크해 줍니다.

    int result = abs(n - 100);

    result 변수에는 100번 부터 시작해 n번까지 누르는 횟수 입니다.

    예를 들어 n이 101이면 '+' 버튼 1번만 누르면 됩니다.

    마지막에 비교해줄것입니다.

    for (int i = 0; i <= 1000000; i++) {
    	int ans = i;
    	int len = check(ans);
    	if (len > 0) {
    		int button = abs(ans - n);
    		result = min(result, button + len);
    	}
    }
    cout << result;

    i가 0부터 1000000까지 체크하는데 문제에서 주어진 n의 범위는 50만입니다. 

    만약 m이 10이고 모든 번호가 망가졌다면 1000000부터 체크를 해줘야 하므로 반복문을 1000000까지 진행합니다.

    len에는 1) 에 해당하는 버튼 횟수가 들어갑니다. 즉, n번까지 가장 가깝게 버튼을 눌러주는 것입니다.

    check 함수가 이를 수행합니다.

    마지막에 result 변수에 result와 1)을 비교해 넣어줍니다.

    int check(int n) {
    	if (n == 0) {
    		if (chk[0])
    			return 0;
    		else return 1;
    	}
    	int len = 0;
    	while (n > 0) {
    		if (chk[n % 10])return 0;
    		n /= 10;
    		len++;
    	}
    	return len;
    }

    전체 코드입니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <string>
    #include <stack>
    #include <queue>
    #include <deque>
    #include <cmath>
    #include <map>
    #include <set>
    #include <tuple>
    #define MAX 2100000000
    #define inf LONG_MAX
    #define big(a, b) a > b ? a : b
    using namespace std;
    using ll = long long;
    using ull = unsigned long long;
    bool chk[10];
    int check(int n);
    int main() {
        ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
        int n;
        cin >> n;
        
        int m;
        cin >> m;
        for (int i = 0; i < m; i++) {
            int a;
            cin >> a;
            chk[a] = true;
        }
        int result = abs(n - 100);
     
        for (int i = 0; i <= 1000000; i++) {
            int ans = i;
            int len = check(ans);
            if (len > 0) {
                int button = abs(ans - n);
                result = min(result, button + len);
            }
        }
        cout << result;
     
        return 0;
    }
    int check(int n) {
        if (n == 0) {
            if (chk[0])
                return 0;
            else return 1;
        }
        int len = 0;
        while (n > 0) {
            if (chk[n % 10])return 0;
            n /= 10;
            len++;
        }
        return len;
    }
    cs

    '백준 문제' 카테고리의 다른 글

    백준 7662 (이중 우선순위 큐) c++  (0) 2022.08.16
    백준 5430 (AC) C++  (0) 2022.08.10
    백준 6064 (카잉 달력) c++  (0) 2022.08.07
    백준 1541 (잃어버린 괄호) c++  (0) 2022.08.01
    백준 17626 (Four Squares) c++  (0) 2022.07.30
Designed by Tistory.