Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준
- Unreal Engine 5
- BFS
- 스택
- 시뮬레이션
- Team Fortress 2
- 수학
- VR
- 유니온 파인드
- 정렬
- DFS
- 그리디 알고리즘
- 재귀
- 그래프
- 투 포인터
- 누적 합
- XR Interaction Toolkit
- 알고리즘
- ue5
- 다익스트라
- c++
- 구현
- 백트래킹
- 트리
- 우선순위 큐
- 자료구조
- 유니티
- 브루트포스
- 다이나믹 프로그래밍
- 문자열
Archives
- Today
- Total
1일1알
백준 2138번 전구와 스위치 C++ 본문
맨 앞의 전구부터 순차적으로 만약 자기보다 앞에 있는 전구가 목표로 하는 상태와 같으면 누르지 않고 다음 전구로 넘어가고, 만약 다르다면 스위치를 눌러서 상태를 같게 만들어준 뒤 다음 전구로 넘어가는 방식으로 문제를 해결하였다.
여기서 주의해야할 점은 맨 앞의 전구는 자기보다 앞에 있는 전구가 없어서 비교가 불가능하기 때문에 맨 앞에 있는 전구를 눌렀을 때와 안눌렀을 때 이 두 경우를 모두 조사해야 한다.
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
using namespace std;
typedef long long ll;
int n;
string str, str_Push_First, target;
bool isPossible = false;
int ans = 987654321;
void Switch_On(int index, int num) {
for (int i = index - 1; i < index - 1 + num; i++) {
if (str[i] == '0') {
str[i] = '1';
}
else {
str[i] = '0';
}
}
}
void Solve(int index, int cnt) {
//마지막 전구에 도달했을 때
if (index == n - 1) {
if (str[index - 1] == target[index - 1] && str[index] == target[index]) {
ans = min(ans, cnt);
return;
}
else {
Switch_On(index, 2); //마지막 전구여서 2개만 바꿔준다
cnt++;
if (str[index - 1] == target[index - 1] && str[index] == target[index]) {
ans = min(ans, cnt);
return;
}
else return;
}
}
//한칸 앞의 전구가 목표 상태와 같을때
if (str[index - 1] == target[index - 1]) {
Solve(index + 1, cnt);
}
//다를때
else {
Switch_On(index, 3); //스위치를 켜서 3개의 상태를 바꾼다
Solve(index + 1, cnt + 1);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
cin >> str >> target;
str_Push_First = str;
for (int i = 0; i < 2; i++) {
if (str_Push_First[i] == '0') {
str_Push_First[i] = '1';
}
else {
str_Push_First[i] = '0';
}
}
Solve(1, 0);
str = str_Push_First;
Solve(1, 1);
if (ans == 987654321) cout << -1;
else cout << ans;
};
'알고리즘' 카테고리의 다른 글
백준 4889번 안정적인 문자열 C++ (0) | 2021.11.30 |
---|---|
백준 4883번 삼각 그래프 C++ (0) | 2021.11.29 |
백준 18428번 감시 피하기 C++ (0) | 2021.11.27 |
백준 1303번 전쟁-전투 C++ (0) | 2021.11.26 |
백준 14716번 현수막 C++ (0) | 2021.11.25 |