반응형
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 | 31 |
Tags
- BOJ
- upper_bound
- 오퍼레터
- 물채우기
- 매개변수탐색
- BFS
- 연결요소
- 소프티어
- 백트래킹
- softeer
- OFFSET
- boj #19237 #어른 상어
- dfs
- 파라메트릭
- 성적평가
- Docker
- 백준
- 경력
- 퇴사통보
- 이분탐색
- incr
- 처우협의
- 기술면접
- 13908
- Kafka
- msSQL
- @P0
- 6987
- compose
- 처우산정
Archives
- Today
- Total
기술 블로그
2138번 전구와 스위치 본문
728x90
반응형
https://www.acmicpc.net/problem/2138
0번 스위치를 누를 때와 누르지 않을 때 2가지 경우를 나누어 구현한다.
idea)
i번 째 스위치를 누를지 말지 고민하는 상황일 때,
현재 i-1번 째 스위치의 현재 상태와
우리가 만들고자 하는 전구의 i-1번 째 스위치의 상태가 다르면
눌러야 한다.
#include <bits/stdc++.h>
using namespace std;
#define MAX 200000
int n, now[MAX], now2[MAX], goal[MAX], ans1, ans2;
bool isSame() {
for (int i = 0; i < n; i++) {
if (now[i] != goal[i]) {
return false;
}
}
return true;
}
int main()
{
cin.tie(0);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%1d", &now[i]);
now2[i] = now[i];
}
for (int i = 0; i < n; i++) {
scanf("%1d", &goal[i]);
}
// 0번 스위치를 안 눌렀을 때
for (int i = 1; i < n; i++) {
// 1번 스위치부터 시작
// 이전 i-1번 째 스위치(now, goal)의 상태가 다를 경우,
// 현재 i번 째 스위치를 누른다.
if (now[i - 1] != goal[i - 1]) {
++ans1;
// 누르면, i-1, i, i+1의 전구 상태가 변한다.
if (i - 1 >= 0) now[i - 1] = 1 - now[i - 1];
now[i] = 1 - now[i];
if (i + 1 < n) now[i + 1] = 1 - now[i + 1];
}
}
// 같지 않다면
if (!isSame()) {
ans1 = -1; // -1로 초기화
}
// 초기 상태로 초기화
for (int i = 0; i < n; i++) {
now[i] = now2[i];
}
// 0번 스위치를 눌렀을 때
++ans2;
now[0] = 1 - now[0];
now[1] = 1 - now[1];
for (int i = 1; i < n; i++) {
if (now[i - 1] != goal[i - 1]) {
++ans2;
if (i - 1 >= 0) now[i - 1] = 1 - now[i - 1];
now[i] = 1 - now[i];
if (i + 1 < n) now[i + 1] = 1 - now[i + 1];
}
}
// 같지 않다면
if (!isSame()) {
ans2 = -1; // -1로 초기화
}
/*
같이 않을 때, -1이 아니라 0으로 초기화하면 안 된다. 답이 0이 나올 수 있음.
2
01
01
correct : 0
wrong : 2
*/
if (ans1 == -1 && ans2 == -1) printf("-1\n");
if (ans1 == -1 && ans2 != -1) printf("%d\n", ans2);
if (ans1 != -1 && ans2 == -1) printf("%d\n", ans1);
if (ans1 != -1 && ans2 != -1) printf("%d\n", min(ans1, ans2));
return 0;
}
728x90
반응형
'알고리즘 문제 > BOJ' 카테고리의 다른 글
13335번 트럭 (0) | 2022.05.04 |
---|---|
18430번 무기 공학 (0) | 2022.05.04 |
17471번 게리맨더링 (0) | 2022.04.27 |
9935번 문자열 폭발 (0) | 2022.04.24 |
15683번 감시 (0) | 2022.03.09 |