λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 12782번 - λΉ„νŠΈ μš°μ •μ§€μˆ˜

by μ•ˆμ£Όν˜• 2022. 9. 27.

문제

 

12782번: λΉ„νŠΈ μš°μ •μ§€μˆ˜

μ§„ν™μ΄λŠ” 숫자λ₯Ό μ’‹μ•„ν•œλ‹€. μ˜€λŠ˜λ„ 숫자λ₯Ό 가지고 λ†€λ˜ μ§„ν™μ΄λŠ” 두 숫자의 λΉ„νŠΈ μš°μ •μ§€μˆ˜λ₯Ό κ΅¬ν•΄λ³΄μ•˜λ‹€. λΉ„νŠΈ μš°μ •μ§€μˆ˜λž€, 10μ§„λ²•μœΌλ‘œ λ‚˜νƒ€λ‚Έ 두 μ •μˆ˜λ₯Ό μ΄μ§„μˆ˜λ‘œ λ‚˜νƒ€λ‚΄μ—ˆμ„ λ•Œ, 두 숫자λ₯Ό κ°™

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int T; cin>>T;
    while(T--){
        string a, b; cin>>a>>b;
        queue<int> zero, one;
        int ans = 0;
        
        for(int i=0; i<a.length(); i++){
            if(a[i] != b[i]){
                if(a[i] == '0') zero.push(i);
                else if(a[i] == '1') one.push(i);
            }
        }
        int len = min(zero.size(), one.size());
        
        while(len--){   // ν•˜λ‚˜μ˜ μ΄μ§„μˆ˜μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ μžλ¦¬μ— μžˆλŠ” 두 숫자의 μœ„μΉ˜λ₯Ό λ°”κΎΌλ‹€.
            swap(a[zero.front()], a[one.front()]);
            zero.pop();
            one.pop();
            ans++;
        }
        for(int i=0; i<a.length(); i++){    // ν•˜λ‚˜μ˜ μ΄μ§„μˆ˜μ—μ„œ μž„μ˜μ˜ 자리의 숫자λ₯Ό 0 λ˜λŠ” 1둜 λ°”κΎΌλ‹€.
            if(a[i] != b[i]) ans++;
        }
        cout<<ans<<'\n';
    }
    
}

 

풀이

AλΉ„νŠΈμ™€ BλΉ„νŠΈκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ AλΉ„νŠΈλ₯Ό B λΉ„νŠΈλ‘œ μ•„λž˜μ˜ 두 연산을 가지고 λ§Œλ“€ 수 μžˆλŠ” μ΅œμ†Œ μ—°μ‚° 횟수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

  1. ν•˜λ‚˜μ˜ μ΄μ§„μˆ˜μ—μ„œ μž„μ˜μ˜ 자리의 숫자λ₯Ό 0 λ˜λŠ” 1둜 λ°”κΎΌλ‹€.
  2. ν•˜λ‚˜μ˜ μ΄μ§„μˆ˜μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ μžλ¦¬μ— μžˆλŠ” 두 숫자의 μœ„μΉ˜λ₯Ό λ°”κΎΌλ‹€.

2번 연산을 μ΅œλŒ€ν•œ μ‚¬μš©ν•΄μ•Ό μ΅œμ†Œ μ—°μ‚° 횟수λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 풀이 μ•„μ΄λ””μ–΄λŠ” 2번 연산을 μ΅œλŒ€ν•œ μ‚¬μš©ν•œ ν›„ 1번 연산을 μ΄μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

00110100 10010111

μœ„μ™€ 같은 μ˜ˆμ‹œλ₯Ό 가지고 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ¨Όμ € 2번 연산을 μ΅œλŒ€ν•œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ AλΉ„νŠΈμ™€ BλΉ„νŠΈμ˜ 인덱슀λ₯Ό 비ꡐ해 κ°€λ©΄μ„œ λΉ„νŠΈκ°€ λ‹€λ₯Ό 경우 0 μˆ«μžμ™€ 1 숫자 각각의 μœ„μΉ˜λ₯Ό μ•„λž˜μ™€ 같이 μ €μž₯ν•©λ‹ˆλ‹€.

  • zero = [0, 6, 7]
  • one = [2]

κ·Έ ν›„, λ‘˜ 쀑 μž‘μ€ μ‚¬μ΄μ¦ˆμ˜ 크기만큼 λ°˜λ³΅ν•˜λ©΄μ„œ 0의 μœ„μΉ˜μ™€ 1의 μœ„μΉ˜λ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€. μœ„μ˜ 경우 00110100의 0번째 μΈλ±μŠ€μ™€ 2번째 인덱슀λ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€.

κ·Έ ν›„ , 1번 연산을 μœ„ν•΄  AλΉ„νŠΈμ™€ BλΉ„νŠΈμ˜ 인덱슀λ₯Ό 비ꡐ해 κ°€λ©΄μ„œ λΉ„νŠΈκ°€ λ‹€λ₯Ό 경우 0 λ˜λŠ” 1둜 λ°”κΎΈλŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ λ©λ‹ˆλ‹€.

λŒ“κΈ€