주어진 숫자와 정답 숫자를 비교하여 가장 먼저 차이가 나는 곳 부터 마지막으로 차이가 나는 곳을 범위로 해서 스위치를 작동하면 최소로 해서 구할 수 있지 않을 까 생각을 해봤는데 만약에 답이 나오지 않을 경우엔 별다른 기준이 없다면 시간 초과에 걸릴 것이므로 다른 접근 법을 생각해 보기로 했다.
위와 마찬가지로 DFS로 접근하면 입력값의 범위가 너무 커 무조건 시간초과가 날 것이라고 생각했다.
2-1. DFS를 살짝 보완하여 set에 다가 이미 나온 범위에 대한 중복을 설정하여 값을 갱신하면 괜찮지 않을까 했는데 그럼 같은 위치에서 같은 형태가 나오는 것이 아닌 이상 2번과 별 다를게 없다고 생각하여서 다른 접근법을 생각하기로 했다.
솔직히 그리디 알고리즘이라는 힌트를 보고도 정확히 느낌이 안와서 너무 헤맸던 것 같다. 관련 문제를 많이 접해봐야겠다.
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <math.h>
#include <set>
#include <map>
#include <deque>
using namespace std;
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0, 0, 1, -1 };
int N;
string orig;
string ans;
string tmp;
int minVal = 1e9;
int cnt = 0;
void lightOn(int i)
{
if(i > 0)tmp[i - 1] = (tmp[i - 1] == '0') ? '1' : '0';
tmp[i] = (tmp[i] == '0') ? '1' : '0';
if (i < N-1)
tmp[i + 1] = (tmp[i + 1] == '0') ? '1' : '0';
}
void solve(int first)
{
tmp = orig;
cnt = 0;
if (first == 0)
{
tmp[0] = (tmp[0] == '0') ? '1' : '0';
tmp[1] = (tmp[1] == '0') ? '1' : '0';
cnt++;
}
for (size_t i = 1; i < N; i++)
{
if (tmp[i - 1] != ans[i - 1])
{
lightOn(i);
cnt++;
}
}
if (tmp == ans)
minVal = min(minVal, cnt);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
cin >> orig >> ans;
solve(0);
solve(1);
if (minVal == 1e9)
cout << -1;
else
cout << minVal;
return 0;
}