bool breakDown[11];
//부서진 번호 입력
for(int i = 0; i < m; ++i){
int num;
cin >> num;
breakDown[num] = true;
}
초기 최솟값 설정
최소 이동을 표현하기 위한 minimum 변수를 만드며, 초기값은 abs(n-100)
int minimum = abs(n-100);
위처럼 구현한 이유는?
만약 n 이 100보다 작을 수 있기 때문에
예) n = 10, mnimum = 90, 현재로서 최솟값은 90번 ( - ) 버튼을 눌러야 10에 도달할 수 있다.
연산 로직
////부서진 번호가 있는지 확인하는 함수 check
bool check(int num){
//문자열로 변환후 연산
string st = to_string(num);
for(int i = 0; i < st.length(); ++i)
if(breakDown[st[i]-'0']) return false;
return true;
}
//연산 로직
for(int i = 0; i <= 1'000'000; ++i){
int tmp = 0;
if(check(i)){
tmp = abs(n-i)+to_string(i).length();
minimum = min(minimum, tmp);
}
}
어째서 500'000이 아니라 1'000'000 일까?
예) n = 500'000, i = 500'001, n - i = 1, 500'001과 같이 ( - ) 한 번만 누르면 되는 경우도 있기 때문이다.
전체 코드
#include <bits/stdc++.h>
using namespace std;
void init(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
}
int n, m;
bool breakDown[11];
//부서진 번호가 있는지 확인하는 함수 check
bool check(int num){
string st = to_string(num);
for(int i = 0; i < st.length(); ++i)
if(breakDown[st[i]-'0']) return false;
return true;
}
int main(){
init();
cin >> n >> m;
//입력
for(int i = 0; i < m; ++i){
int num;
cin >> num;
breakDown[num] = true;
}
//초기값 설정
int minimum = abs(n-100);
//연산 로직
for(int i = 0; i <= 1'000'000; ++i){
int tmp = 0;
if(check(i)){
tmp = abs(n-i)+to_string(i).length();
minimum = min(minimum, tmp);
}
}
cout << minimum <<'\n';
return 0;
}
문제를 풀며
나에게는 감도 잡지 못할 정도로 어려운 문제였다. 새로운 아이디어를 얻은 것 같다
abs(n-100)과 같이 초기값을 설정할 생각을 어떻게 한 걸까
( - )를 누를 경우도 생각해 1'000'000까지 반복문을 돌리는 것또한 그렇다.
이렇듯 배우고자 한다면 문제 하나에서도 여러 가지 아이디어를 얻을 수 있음을 기억하자
요즘 나 혼자 라이벌이라 생각하는 친구가 정말 열심히 하는데, 나도 뒤떨어지고 싶지 않아 괜스레 열심히 하게 된다.