문제한줄요약
고장난 버튼을 제외하고 최소한의 버튼을 눌러 시작번호에서 해당 번호로 이동시킨다.
내가 생각한 조건
시작 번호와 해당 번호가 같으면 0을 출력한다. 그리고 고장난 버튼이 0개일 때는 버튼을 입력받지 않게 처리한다.
최소한의 버튼 횟수를 구하기 위해 (해당 번호) - (버튼을 눌러 만들 수 있는 수)가 최소인 것, 버튼을 눌러 만들 수 있는 수 2가지의 기준을 세워 최소값을 구하려 했었다.
그리고 다른 테스트 케이스에서 버튼을 눌러 만들 수 있는 수들의 합/차라는 기준을 추가해야 한다는 것을 알고 구현 과정에 문제가 생겨서 링크를 참고했다.
작성한 코드
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 | #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; const int MAX = 1000000 + 1; const int INF = 987654321; int n, m; vector<int> v; int fromStart() { return abs(n - 100); } bool possible(int n) { if(n == 0) { if(find(v.begin(), v.end(), 0) == v.end()) return true; else return false; } while(n) { if(find(v.begin(), v.end(), n % 10) != v.end()) return false; n /= 10; } return true; } int length(int n) { if(n == 0) return 1; int res = 0; while(n) { n /= 10; res++; } return res; } int ChangeAll(void) { int res = INF; int num = 0; for(int i = 0; i < MAX; i++) { if(possible(i)) { int click = abs(n - i); if(res > click) { res = click; num = i; } } } return res + length(num); } int main() { cin >> n >> m; for(int i = 0; i < m; i++) { int cnt; cin >> cnt; v.push_back(cnt); } cout << min(fromStart(), ChangeAll()) << '\n'; return 0; } | cs |
피드백
나는 처음에 무조건 수학적 공식을 이용해서 구하려고 했는데 완전 탐색이 더 효율적인 것을 보고 당황스러웠다. (링크 참조) 시간복잡도를 생각하면서 문제를 풀어야 할 것 같은 생각이 든다.
한줄평
무조건 공식을 만들려고 하지 말고 완전탐색을 하는 방법도 고민해 보자.
'이론 공부 내용 정리 > 알고리즘' 카테고리의 다른 글
c++ 시간 초과시 사용하는 코드에 대한 이해 (0) | 2022.07.30 |
---|---|
1. c++ 라이브러리<stack> (0) | 2022.07.27 |
백준 1931_회의실 배정 (0) | 2022.07.17 |
백준 11047_동전 0 (0) | 2022.07.14 |
0. c++라이브러리 <string> (0) | 2022.07.01 |