Game Develop

[Algorithm] Baekjoon 1107번 : 리모컨 본문

Algorithm/Baekjoon

[Algorithm] Baekjoon 1107번 : 리모컨

MaxLevel 2022. 10. 19. 01:03

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

 

1107번: 리모컨

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

www.acmicpc.net

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
#include <functional>
#include <sstream>
#include <memory.h>
 
using namespace std;
 
 
vector<int> cNum;
int minCount = 10000000;
 
 
struct Node
{
    string s;
};
 
 
int BFS(int targetNum)
{
    int answer = 1000000000;
    queue<Node> q;
    q.push({""});
 
    while (!q.empty())
    {
        Node curNode = q.front();
        q.pop();
 
        if (curNode.s.size() > 0)
        {
            int curNum = stoi(curNode.s);
            int temp = curNode.s.size() + abs(targetNum - curNum);
            answer = min(answer, temp);
 
            if (curNode.s.size() >= 6)
            {
                break;
            }
        }
        
        for (int i = 0; i < cNum.size(); i++)
        {
            string temp = curNode.s;
            temp += cNum[i] + '0';
 
            if (temp.size() > 6continue;
            q.push({ temp });
        }
    }
 
    return answer;
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    string target; // 목표채널
    int m = 0;
    int temp = 0;
 
    map<intbool> icm;
 
    int start = 100;
 
    cin >> target >> m;
    
    if (m == 0// 고장난 버튼이 없을경우
    {
        cout << min(abs(100 - stoi(target)), (int)target.size());
        return 0;
    }
 
    for (int i = 0; i < m; i++)
    {
        cin >> temp;
        icm[temp] = true;
    }
 
    for (int i = 0; i <= 9; i++)
    {
        if (!icm[i])
            cNum.push_back(i);
    }
 
    cout << min(BFS(stoi(target)), abs(stoi(target) - start));
 
    return 0;
}
 
 
 
cs

BFS로 해서 통과는 했는데, 성능이 매우 안좋다. 불필요한 노드가 너무 많이 만들어지는듯하다.

나중에 다시 DFS쪽으로 풀어봐야겠다.. 풀어야할 문제가 너무 많아서 조금 미뤄둔다.