알고리즘/PS

[C++] 백준 1107 : 리모컨

BigmacGood 2022. 3. 27. 12:08

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

 

1107번: 리모컨

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

www.acmicpc.net

백준 1107번 리모컨문제를 풀어봤습니다.

직관적으로 풀려다가 6중 for문을 사용하게 됐습니다.

버튼 0이 고장났을 때 자릿수에 맞춰서 if문을 적용시켜줘야 합니다. 반복문에서 222는 000222므로 앞에 있는 세자리의 0은 무시하고 계산했습니다.

 

아래는 전체 코드입니다.

 

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;

bool button[10];

int main() {
	int target;
	int m;
	int cnt = 0;
	int exit = 0;
	int distance = 0;

	fill(button, button+10, 1);

	cin >> target >> m;

	for (int i = 0; i < m; i++) {
		int temp;
		cin >> temp;
		button[temp] = 0;
	}


	int min_sub = 500000;
	int abs_sub;
	int temp;
	int current = -1;
	int loop = -1;

	distance = abs(target - 100);

	for (int a = 0; a < 10; a++) {
	for (int b = 0; b < 10; b++) {
	for (int c = 0; c < 10; c++) {
	for (int d = 0; d < 10; d++) {
	for (int e = 0; e < 10; e++) {
        for (int f = 0; f < 10; f++) {								
            loop++;
            if (button[0] == 0) {
                if (loop < 10) {
                    if (button[f] == 0)
                        continue;
                    else {
                        temp = 0;
                        temp = a * 100000
                            + b * 10000
                            + c * 1000
                            + d * 100
                            + e * 10
                            + f * 1;

                        abs_sub = abs(target - temp);
                        if (abs_sub < min_sub) {
                            min_sub = abs_sub;
                            current = temp;
                        }
                    }
                }
                else if (loop < 100) {
                    if (button[e] == 0 || button[f] == 0)
                        continue;
                    else {
                        temp = 0;
                        temp = a * 100000
                            + b * 10000
                            + c * 1000
                            + d * 100
                            + e * 10
                            + f * 1;

                        abs_sub = abs(target - temp);
                        if (abs_sub < min_sub) {
                            min_sub = abs_sub;
                            current = temp;
                        }
                    }
                }
                else if (loop < 1000) {
                    if ( button[d] == 0 || button[e] == 0 || button[f] == 0)
                        continue;
                    else {
                        temp = 0;
                        temp = a * 100000
                            + b * 10000
                            + c * 1000
                            + d * 100
                            + e * 10
                            + f * 1;

                        abs_sub = abs(target - temp);
                        if (abs_sub < min_sub) {
                            min_sub = abs_sub;
                            current = temp;
                        }
                    }
                }
                else if (loop < 10000) {
                    if ( button[c] == 0
                        || button[d] == 0 || button[e] == 0 || button[f] == 0)
                        continue;
                    else {
                        temp = 0;
                        temp = a * 100000
                            + b * 10000
                            + c * 1000
                            + d * 100
                            + e * 10
                            + f * 1;

                        abs_sub = abs(target - temp);
                        if (abs_sub < min_sub) {
                            min_sub = abs_sub;
                            current = temp;
                        }
                    }
                }
                else if (loop < 100000) {
                    if (button[b] == 0 || button[c] == 0
                        || button[d] == 0 || button[e] == 0 || button[f] == 0)
                        continue;
                    else {
                        temp = 0;
                        temp = a * 100000
                            + b * 10000
                            + c * 1000
                            + d * 100
                            + e * 10
                            + f * 1;

                        abs_sub = abs(target - temp);
                        if (abs_sub < min_sub) {
                            min_sub = abs_sub;
                            current = temp;
                        }
                    }
                }
                else if (loop < 1000000) {
                    if (button[a] == 0 || button[b] == 0 || button[c] == 0
                        || button[d] == 0 || button[e] == 0 || button[f] == 0)
                        continue;
                    else {
                        temp = 0;
                        temp = a * 100000
                            + b * 10000
                            + c * 1000
                            + d * 100
                            + e * 10
                            + f * 1;

                        abs_sub = abs(target - temp);
                        if (abs_sub < min_sub) {
                            min_sub = abs_sub;
                            current = temp;
                        }
                    }
                }
            }
            else if ( button[a] == 0 || button[b] == 0 || button[c] == 0
                || button[d] == 0 || button[e] == 0 ||button[f] == 0)
                continue;
            else {
                temp = 0;
                temp = a * 100000
                    + b * 10000
                    + c * 1000
                    + d * 100
                    + e * 10
                    + f * 1;

                abs_sub = abs(target - temp);
                if (abs_sub < min_sub) {
                    min_sub = abs_sub;
                    current = temp;
                }
            }
    	}
    }
    }
    }
    }
    }

	if (current == -1) {
		min_sub = abs(target - 100);
	}
	else {
		string current_str = to_string(current);

		cnt = current_str.size();
		min_sub += cnt;
	}

	if (distance < min_sub)
		cnt = distance;
	else
		cnt = min_sub;

	cout << cnt;

	return 0;
}