[c++] BOJ 1107๋ฒˆ :: ๋ฆฌ๋ชจ์ปจ (์ฝ”๋“œ, ํ…Œ์ŠคํŠธ์ผ€์ด์Šค)

๋ฆฌ๋ชจ์ปจ

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

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งž์€ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 256 MB 29717 6775 4628 22.196%

๋ฌธ์ œ

์ˆ˜๋นˆ์ด๋Š” TV๋ฅผ ๋ณด๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ์ฑ„๋„์„ ๋Œ๋ฆฌ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, ๋ฒ„ํŠผ์„ ๋„ˆ๋ฌด ์„ธ๊ฒŒ ๋ˆ„๋ฅด๋Š” ๋ฐ”๋žŒ์—, ์ผ๋ถ€ ์ˆซ์ž ๋ฒ„ํŠผ์ด ๊ณ ์žฅ๋‚ฌ๋‹ค.

๋ฆฌ๋ชจ์ปจ์—๋Š” ๋ฒ„ํŠผ์ด 0๋ถ€ํ„ฐ 9๊นŒ์ง€ ์ˆซ์ž, +์™€ -๊ฐ€ ์žˆ๋‹ค. +๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ˜„์žฌ ๋ณด๊ณ ์žˆ๋Š” ์ฑ„๋„์—์„œ +1๋œ ์ฑ„๋„๋กœ ์ด๋™ํ•˜๊ณ , -๋ฅผ ๋ˆ„๋ฅด๋ฉด -1๋œ ์ฑ„๋„๋กœ ์ด๋™ํ•œ๋‹ค. ์ฑ„๋„ 0์—์„œ -๋ฅผ ๋ˆ„๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ฑ„๋„์ด ๋ณ€ํ•˜์ง€ ์•Š๊ณ , ์ฑ„๋„์€ ๋ฌดํ•œ๋Œ€ ๋งŒํผ ์žˆ๋‹ค.

์ˆ˜๋นˆ์ด๊ฐ€ ์ง€๊ธˆ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ฑ„๋„์€ N์ด๋‹ค. ์–ด๋–ค ๋ฒ„ํŠผ์ด ๊ณ ์žฅ๋‚ฌ๋Š”์ง€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฑ„๋„ N์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฒ„ํŠผ์„ ์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผํ•˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ˆ˜๋นˆ์ด๊ฐ€ ์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ์ฑ„๋„์€ 100๋ฒˆ์ด๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜๋นˆ์ด๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ฑ„๋„ N (0 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ์˜ ๊ฐœ์ˆ˜ M (0 ≤ M ≤ 10)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์…‹์งธ ์ค„์—๋Š” ๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ์ด ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ™์€ ๋ฒ„ํŠผ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ฑ„๋„ N์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„ํŠผ์„ ์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋‚˜์˜ ๋‹ต

์ฝ”๋“œ

์ฒซ๋ฒˆ์งธ (์กฐ๊ฑด ์‚ฌ์šฉ)

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int N, M;
int tmp_arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
vector<int> num_arr;
vector<int> clicked_btns;
vector<int>::iterator iter;

int near_num = 1e9;
int store_num = 1e9;
int length_N;

bool isInNumArr(int num) {
    int size = num_arr.size();
    for (int i = 0; i < size; i++) {
        if (num == num_arr[i])
            return true;
    }
    return false;
}

void findNearNum(int num, int len, int now_num) {
    if (len == -1) {
        int tmp = abs(N - now_num);
        if (near_num > tmp) {
            near_num = tmp;
            store_num = now_num;
        }
        return;
    }

    vector<int> tmp_buttons;
    if (length_N == len + 1 && len>0) 
        // ๋‘ ์ž๋ฆฌ ์ด์ƒ์ผ ๋•Œ, ๋งจ ์ฒ˜์Œ์— 0์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ
        // 100 ์ดํ•˜์ผ ๋–„ ์ฒซ์ž๋ฆฌ์— 0์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 1๋ฒˆ๋งŒ checkํ•˜๋ฉด ๋จ
        // 100์ด์ƒ์ผ ๋–„๋Š” 0์ด ๋‚˜์™€๋„ 100์—์„œ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์œผ๋ฏ€๋กœ ๋‘ ๋ฒˆ ์ด์ƒ ๋น„๊ตํ•  ํ•„์š” x
        tmp_buttons.push_back(0);

    int first = num / pow(10, len);

    /*
    if (first < 0)
        first = -1;
    else if (first > 10)
        first = 10;
    */

    int flag = 0;
    if (isInNumArr(first)) {
        tmp_buttons.push_back(first);
        flag = 1;
    }

    int dist = 1;
    while (1) { //3
        if (isInNumArr(first - dist)) {
            tmp_buttons.push_back(first - dist);
            flag = 1;
        }
        if (isInNumArr(first + dist)) {
            tmp_buttons.push_back(first + dist);
            flag = 1;
        }
        dist++;
        if (first - dist < 0 && first + dist > 9)
            break;
        if (flag)
            break;
        flag = 0;
    }

    int size = tmp_buttons.size();
    for (int i = 0; i < size; i++) { // 3
        int tmp = tmp_buttons[i];
        findNearNum(num - tmp * pow(10, len), len - 1, now_num * 10 + tmp); // 6
    }
}

int getLength(int num) { // 6
    int length = 1;
    while (num /= 10)
        length++;
    return length;
}

int main() {
    cin >> N >> M;
    for (int i = 0; i < M; i++) {
        int tmp; cin >> tmp;
        tmp_arr[tmp] = -1;
    }

    for (int i = 0; i < 10; i++) { // ์žˆ๋Š” ๋ฒ„ํŠผ ์ €์žฅ
        if (tmp_arr[i] != -1)
            num_arr.push_back(i);
    }

    int n1 = abs(N - 100);

    length_N = getLength(N);
    findNearNum(N, length_N - 1, 0);

    int n2 = near_num + getLength(store_num);

    //cout << near_num << " " << store_num << endl;

    cout << (n1 > n2 ? n2 : n1);
}

 ๊ฐ ์ž๋ฆฟ์ˆ˜๋งˆ๋‹ค ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ž๋ฆฌ(์ตœ๋Œ€ 3๊ฐœ)๋ฅผ arr์— ๋„ฃ๊ณ  ์žฌ๊ท€ ํ˜ธ์ถœํ•ด์„œ ํ‘ธ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด ์ฝ”๋“œ์—์„œ๋Š” ์ž๋ฆฟ์ˆ˜๋•Œ๋ฌธ์— ์ฃผ์–ด์ ธ์•ผํ•  ์กฐ๊ฑด์ด ๋งŽ์€๋ฐ, ์ด ์กฐ๊ฑด์„ ๋‹ค ๊ธฐ์žฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค brute force ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.

 

ex_)

1000
2
0 1

์ผ ๋•Œ, 4์ž๋ฆฌ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ 3์ž๋ฆฌ ์ˆ˜์ธ 999๋ฅผ ๊ณ ๋ คํ•˜๋ ค๋ฉด ์ฒซ์ž๋ฆฌ์— 0์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.

9999
1
9

์ผ ๋•Œ, 4์ž๋ฆฌ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ 5์ž๋ฆฌ ์ˆ˜์ธ 10000์„ ๊ณ ๋ คํ•˜๋ ค๋ฉด ํ•œ ์ž๋ฆฌ ์ˆ˜ ๋” ํฐ ์ž๋ฆฟ์ˆ˜๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณต์žกํ•ด์ง€๋ฏ€๋กœ brute force๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.

 

 

๋‘๋ฒˆ์งธ (brute force)

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int N, M;
int N_length = 0;
int tmp_arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
vector<int> num_arr;

int near_dist = 1e9;
int near_num = 1e9;

int getLength(int num) {
    int length = 1;
    while (num /= 10)
        length++;
    return length;
}

void findNearNum(int size, int num) { // size : ์ˆซ์ž ๊ธธ์ด
    if (size == 0) {
        int tmp = abs(N - num) + getLength(num);
        if (tmp < near_dist) {
            near_dist = tmp;
            near_num = num;
        }
        return;
    }

    int num_size = num_arr.size();
    for (int i = 0; i < num_size; i++) {
        findNearNum(size - 1, num * 10 + num_arr[i]);
    }
}

int main() {
    cin >> N >> M;

    int tmpN = N;
    N_length = getLength(N);

    for (int i = 0; i < M; i++) {
        int tmp; cin >> tmp;
        tmp_arr[tmp] = -1;
    }

    for (int i = 0; i < 10; i++) { // ์žˆ๋Š” ๋ฒ„ํŠผ ์ €์žฅ
        if (tmp_arr[i] != -1)
            num_arr.push_back(i);
    }

    int n1 = abs(N - 100);
    int n2 = 1e9;

    if (num_arr.size() != 0) {
        for (int size = N_length - 1; size <= N_length + 1; size++) {
            if (size == 0) { // ํ•œ๊ธ€์ž
                continue;
            }
            findNearNum(size,0);
        }
    }

    n2 = near_dist;
    //cout << near_dist << " " << near_num << endl;

    cout << (n1 > n2 ? n2 : n1);
}

 

 

ํ…Œ์ŠคํŠธ์ผ€์ด์Šค

1235 3
1 2 3

=> 236 999
=> 239

0
9
0 1 2 3 4 5 6 7 9
=> 8 8
=> 9

5678
0
=> 0 5678
=> 4

150
2
1 6
=> 50 200
=> 50

9999
1
9
=> 10000
=> 6

(์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ ์•ˆ๋˜๋Š” testcase)
=> 8888
=> 1115


1000
2
0 1
=> 999
=> 4

(์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ ์•ˆ๋˜๋Š” testcase)
=> 2222
=> 900

=> 1 999
=> 4

199
1 9
=> 4

์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ๊ฐ€ ์‹คํŒจํ•œ ์ด์œ ๋Š” ์ฃผ์–ด์ง„ ์ˆ˜์—์„œ ์ž๋ฆฟ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ๋” ๋†’์€ ๊ฒฝ์šฐ๋‚˜ ํ•˜๋‚˜ ๋” ๋‚ฎ์€ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์กฐ๊ฑด์„ ๋งŽ์ด ์ฃผ๋ฉด ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ brute force๋กœ ํ’€ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— brute force๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•