Skip to main content
  1. Posts/
  2. Algorithm/

BOJ 2138 전구와 스위치

·246 words·2 mins
Jiho Kim
Author
Jiho Kim
달려 또 달려

📝 문제 정보
#

🧐 관찰 및 접근
#

  • 첫번째 / 마지막 전구를 제외하고는, 그리디하게 끄는 규칙이 가능하다.
  • 첫번째 전구를 건드린 경우 / 안건드린 경우 두가지에 대해, 그리디하게 끄고 전체를 끌 수 있는지 확인하자.

💻 풀이
#

  • 코드 (C++):
void solve(){
    int N; cin >> N;
    string S, T; cin >> S >> T;
    string ret = "";
    rep(i, 0, N) ret += (S[i] == T[i] ? "0" : "1");

    int ans = 1e9;

    // don't flip first
    string tmp = ret;
    int cnt = 0;
    rep(i, 1, N){
        if(tmp[i-1] == '1'){
            cnt++;
            tmp[i-1] = (tmp[i-1] == '1' ? '0' : '1');
            tmp[i] = (tmp[i] == '1' ? '0' : '1');
            if(i+1 < N) tmp[i+1] = (tmp[i+1] == '1' ? '0' : '1');
        }
    }
    if(tmp[N-1] == '0') ans = min(ans, cnt);

    // flip first
    tmp = ret;
    cnt = 1;
    tmp[0] = (tmp[0] == '1' ? '0' : '1');
    tmp[1] = (tmp[1] == '1' ? '0' : '1');
    rep(i, 1, N){
        if(tmp[i-1] == '1'){
            cnt++;
            tmp[i-1] = (tmp[i-1] == '1' ? '0' : '1');
            tmp[i] = (tmp[i] == '1' ? '0' : '1');
            if(i+1 < N) tmp[i+1] = (tmp[i+1] == '1' ? '0' : '1');
        }
    }
    if(tmp[N-1] == '0') ans = min(ans, cnt);

    if(ans == 1e9) ans = -1;
    cout << ans << "\n";
}
🔒

구현 코드 잠금

아래 쿠팡 링크를 방문하시면 코드가 공개됩니다.
광고 수익이 블로그 운영에 도움이 됩니다 🙏

🛒 쿠팡 방문하고 코드 보기

방문 후 잠금이 자동으로 해제됩니다