본문 바로가기
코딩테스트_백준풀이

리모컨 #1107 c++ 풀이

by wanna_dev 2023. 10. 24.

 

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

 

1107번: 리모컨

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

www.acmicpc.net

브루트 포스 2초 2억번 계산에 맞게 알고리즘 짜기가 생각보다 만만치 않았던 문제

0. 0인 경우 0.
1. 처음부터 +,-로만 이동하는 경우와 비교
2. 어디까지 이동한 다음 + 혹은 -로 이동하는 경우와 비교

   2.1. 어디까지 이동이라는 것은 고장나지 않은 숫자로 만들수 있는 모든 숫자를 의미(brute force)

   2.2. 그런 다음 abs(이동한 수 - target)을 숫자에 더해줌
ans = min(1,2); //정답

 

모든 수를 구할때, MAX 를 가정하는 것이 어려웠다. 
//예제입력 3에서 500000으로 가는 경우 1,5을 제외한 모든 숫자가 고장남
//11117이 나오려면, 511111(6번) -를 11111번 눌러야함

// MAX가 500000라면, 34~~~~ 의 수가 나옴 예제 정답은 1111~~
// MAX가 500000보단 크다는 결론.
// 999999 0-9로 만들수 있는 가장 큰 수가 MAX일 것.

 

따라서 10만 * log(50만) 정도의 연산으로 해결

24ms => 1초 : 10^8 = 0.024초 : x ,

x  = 24*10^5번 계산

#include <iostream>
#include <string>
#include <cmath> 
#define MAX 999999
//0. 0인 경우 0.
//1. 처음부터 +,-로만 이동하는 경우와 비교
//2. 어디까지 이동한 다음 + 혹은 -로 이동하는 경우와 비교
//ans = min(1,2);

//예제입력 3에서 500000으로 가는 경우 1,5을 제외한 모든 숫자가 고장남
//11117이 나오려면, 511111(6번) -를 11111번 눌러야함
// MAX가 500000보단 크다는 결론.
// 999999 0-9로 만들수 있는 가장 큰 수가 MAX일 것.

using namespace std;

int n;
bool state[10];


bool check(int num) {
    if (num == 0) {
        if (state[0] == false) return false;
        else return true;
    }
    while (num) {
        if (state[num % 10] == false) return false;
        num /= 10;
    }
    return true;
}


int getMin(int num)
{
    int minPressCnt = MAX, pressCnt;
    for (int i = 0; i <= MAX; i++) {
        if (check(i)) {
            pressCnt = to_string(i).length();
            pressCnt += abs(i - num);
            minPressCnt = min(minPressCnt, pressCnt);
        }
    }
    return min(abs(num - 100), minPressCnt);
}

int main(void)
{
    int m, tmp;
    cin >> n >> m;
    for (int i = 0; i < 10; i++) state[i] = true; // init
    for (int i = 0; i < m; i++) {
        cin >> tmp;
        state[tmp] = false;
    }
    cout << getMin(n) << '\n';
    return 0;
}

 

 

'코딩테스트_백준풀이' 카테고리의 다른 글

DSLR #9019 c++ 풀이  (0) 2023.10.26
숨바꼭질 #1697 c++ 풀이  (0) 2023.10.26
DFS와 BFS #1260 c++ 풀이  (1) 2023.10.24
유기농 배추 #1012 c++ 풀이  (0) 2023.10.24
Z #1074 c++ 풀이  (0) 2023.10.23