본문 바로가기
알고리즘/백준 문제

2138 - 전구와 스위치

by HDobby 2023. 8. 6.

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

댓글