백준 algorithm
백준 1107 - 리모컨
cosmohoo
2020. 6. 2. 14:19
반응형

=> 브루트 포스 문제입니다.
-
이동할 채널 C를 정합니다.
-
C에 포함되어있는 숫자 중에 고장 난 버튼이 있는지 확인합니다.
-
고장 난 버튼이 포함되어 있지 않다면 |C-N|을 계산해 +나 -버튼을 몇 번 눌러야 하는지를 계산합니다.
=> 위의 방식에 따라 문제를 풀이합니다.
=> 고장난 버튼을 확인하기 위해 broken []이라는 bool형 array를 사용하였습니다.
=> 채널은 50만이지만, 숫자 버튼을 눌러서 이동하는 채널은 100만까지 허용하여야 합니다. (현재의 위치 100 때문)
=> 현재 위치에서 +or -를 눌러서 타겟하는 C로가는 방법
-
현재 위치에서 + or -를 눌러서 타깃 C로 이동하는 방법
-
채널 버튼을 눌러 타겟으로 이동한 다음 버튼을 눌러 이동하는 방법
=> 위의 두가지 중에 최소의 값을 찾아 원하는 값을 찾아야 합니다.
<현재의 숫자가 고장난 버튼이 있는지 없는지 확인하는 함수>
int possible(int c)
{
if( c==0)
{
if(broken[0]) //
{return 0;}
else{
return 1;
}
}
int len =0;
while ( c>0 )
{
if(broken[c%10]){
return 0;
}
len ++;
c /=10;
}
return len;
}
<code>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
bool broken[10];//false
int possible(int c)
{
if( c==0)
{
if(broken[0]) //
{return 0;}
else{
return 1;
}
}
int len =0;
while ( c>0 )
{
if(broken[c%10]){
return 0;
}
len ++;
c /=10;
}
return len;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N;
cin >> N;
int m;
cin >> m;
for(int i=0; i<m; i++)
{
int x;
cin >>x;
broken[x]=true; //true면 고장
}
int ans = N-100;
if(ans <0)
{
ans = -ans;
}
for(int i=0; i<1000000; i++)
{
int c=i;
int len = possible(c);
if(len > 0)
{
int press= c-N;
if(press <0)
{
press = -press;
}
if(ans > press + len)
{
ans = press + len;
}
}
}
cout << ans<<'\n';
}


반응형