https://www.acmicpc.net/problem/2138
2138번: 전구와 스위치
N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는 상태와 꺼져 있는 상태 중 하나의 상태를 가진다. i(1 < i < N)번 스위치를 누르면 i-1, i, i+1의 세 개의 전구의 상태가 바뀐다. 즉, 꺼져
www.acmicpc.net
생각해보기
- 처음 버튼을 누른 경우와 누르지 않은 경우 2가지가 존재한다.
- 메커니즘상 현재 버튼이 아닌 다음 버튼을 누르므로 2가지 경우를 모두 따져봐야 한다.
- 현재 버튼이 아닌 경우 다음 버튼을 누르는 방식으로 진행하여 맨 마지막 버튼이 정답과 일치하는지 확인한다.
코드
#include<iostream>
#include<algorithm>
using namespace std;
int N;
string now, result;
void input(){
cin>>N>>now>>result;
}
//맨 앞부터 다른 경우 다음 위치의 버튼을 눌러가며 진행, 맨 마지막 원소로 최종 확인
int calc(string str){
int cnt = 0;
for(int i=0;i<str.length()-1;++i){
if(str[i] != result[i]){
for(int j=0;j<3;++j){
if(i+j >= str.length())
continue;
str[i+j] = str[i+j] == '0' ? '1' : '0';
}
++cnt;
}
}
//마지막 원소가 동일하면 true
if(str.back() == result.back())
return cnt;
return 987'654'321;
}
void solution(){
//처음 버튼을 누른 경우
string copy = now;
copy[0] = copy[0] == '0' ? '1' : '0';
copy[1] = copy[1] == '0' ? '1' : '0';
//처음 버튼을 누른 경우와 안누른 경우중 더 작은 값
int ans = min(calc(copy)+1, calc(now));
if(ans == 987'654'321)
cout<<-1<<'\n';
else
cout<<ans<<'\n';
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
input();
solution();
return 0;
}

728x90
'알고리즘 > 백준 문제' 카테고리의 다른 글
| 22251 - 빌런 호석 (0) | 2023.08.07 |
|---|---|
| 1863 - 스카이라인 쉬운거 (0) | 2023.08.06 |
| 7682 - 틱택토 (0) | 2023.08.04 |
| 2467 - 용액 (0) | 2023.08.02 |
| 5972 - 택배 배송 (0) | 2023.07.26 |
댓글