백준 알고리즘 풀이 1107번 - 리모컨
2020. 5. 14. 14:09ㆍ프로그래밍/백준 알고리즘
https://www.acmicpc.net/problem/1107
1107번: 리모컨
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼��
www.acmicpc.net
- 브루트 포스 문제.
알고리즘
1. 목표로 하는 채널을 기준으로 두고 1씩 내려가거나 1씩 올린다.
2. 1씩 올리거나 내린 수들이 망가진 키를 포함하지 않는지 검사한다.
3. 망가진 키를 포함한다면 다시 1번으로, 망가진 키를 포함하지않는다면, 100에서 무식하게 올리는 거랑 비교해서 작은 횟수를 출력한다.
예외 조건
1. 100에서 무식하게 올리거나 내린것이 더 적은 이동 횟수를 제공할 수도 있다.
2. 올리거나 내릴때 망가진 키를 동시에 포함하지 않을수도 있다. 그때는 자리수가 작은 거를 선택해야 한다.
(1000 1 0 인 경우를 생각해보자!)
소스코드
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int num,count;
char broken[11];
int get_num(int a){
string st = to_string(a);
return st.length();
}
bool is_included(int a){
string st = to_string(a);
for (int i =0;i<st.length();i++)
for(int j=0;j<count;j++) if(st[i]==broken[j]) return true;
return false;
}
int main()
{
int ans=0;
bool check = false;
cin>>num>>count;
for(int i=0;i<count;i++) cin>>broken[i];
for(int i=0;i<=499900;i++){
int a = num-i;
int b = num +i;
if (!is_included(a) && !is_included(b)){
ans+=i;
check = true;
if(get_num(a)>get_num(b)) ans+=get_num(b);
else ans+=get_num(a);
break;
}
if ( !is_included(a)){
ans+=i;
check = true;
ans+= get_num(a);
break;
}
if(!is_included(b)){
ans+=i;
check = true;
ans+= get_num(b);
break;
}
}
if(check == false){
ans = abs(100-num);
}
else if(abs(100-num)<ans){
ans = abs(100-num);
}
cout<<ans;
return 0;
}
틀린 내용이나 지적 언제나 환영입니다.
도움이 되었다면 하트 한번씩 눌러주세요:)
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 풀이 3197번 - 백조의 호수 (0) | 2021.06.21 |
---|---|
백준 알고리즘 풀이 10942번 - 팰린드롬? (0) | 2020.05.19 |
백준 알고리즘 풀이 1890번 - 점프 (0) | 2019.11.19 |
백준 알고리즘 풀이 11404번 - 플로이드 (0) | 2019.10.28 |
백준 알고리즘 풀이 1915번 - 가장 큰 정사각형 (0) | 2019.10.15 |