μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€

[λ°±μ€€ / BOJ 12782] λΉ„νŠΈ μš°μ •μ§€μˆ˜

KIMHYEYUN 2021. 9. 14. 01:37
λ°˜μ‘ν˜•

https://www.acmicpc.net/problem/12782

 

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

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

www.acmicpc.net

 

문제


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

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

예λ₯Ό λ“€μ–΄, 10μ§„μˆ˜ 11κ³Ό 12의 λΉ„νŠΈ μš°μ •μ§€μˆ˜λ₯Ό κ΅¬ν•΄λ³΄μž. 11을 μ΄μ§„μˆ˜λ‘œ λ‚˜νƒ€λ‚΄λ©΄ 1011이고, 12λ₯Ό μ΄μ§„μˆ˜λ‘œ λ‚˜νƒ€λ‚΄λ©΄ 1100이닀. 1011μ—μ„œ 2의 자리λ₯Ό 0으둜 λ°”κΎΈκ³ (1011 -> 1001), 1의 μžλ¦¬μ™€ 4의 자리의 숫자λ₯Ό μ„œλ‘œ λ°”κΎΈλ©΄(1001 -> 1100) 1100이 λœλ‹€. 즉, 1011을 1100으둜 λ°”κΎΈλŠ” μ΅œμ†Œ μ—°μ‚° νšŸμˆ˜λŠ” 두 번으둜, 11κ³Ό 12의 λΉ„νŠΈ μš°μ •μ§€μˆ˜λŠ” 2κ°€ λœλ‹€.

μ§„ν™μ΄λŠ” μ–΄λ–€ 두 μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ 두 수의 λΉ„νŠΈ μš°μ •μ§€μˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€κ³  μ‹Άλ‹€. ν•˜μ§€λ§Œ, μ•„μ‰½κ²Œλ„ μ§„ν™μ΄λŠ” ν”„λ‘œκ·Έλž˜λ°μ— μ•½ν•΄ 10μ§„μˆ˜λ₯Ό μ΄μ§„μˆ˜λ‘œ λ°”κΎΈλŠ” 것 밖에 ν•˜μ§€ λͺ»ν•œλ‹€. μ—¬λŸ¬λΆ„μ΄ 진홍이λ₯Ό 도와 두 수의 λΉ„νŠΈ μš°μ •μ§€μˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ–΄ 주자!

 

μž…λ ₯


μž…λ ₯의 첫 μ€„μ—λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 T(1 ≤ T ≤ 50)κ°€ μ£Όμ–΄μ§„λ‹€.

각 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ˜ 첫 번째 μ€„μ—λŠ” 두 μ΄μ§„μˆ˜ N, M이 μ£Όμ–΄μ§„λ‹€. N, M의 μžλ¦Ώμˆ˜λŠ” 1,000,000을 λ„˜μ§€ μ•ŠμœΌλ©°, μžλ¦Ώμˆ˜λŠ” μ„œλ‘œ κ°™λ‹€.

좜λ ₯


각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ 두 수의 λΉ„νŠΈ μš°μ •μ§€μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€.

 

 

풀이


bit_1 1 0 1 1
bit_2 1 1 0 0

두 수의 각 λΉ„νŠΈλ“€μ„ λΉ„κ΅ν•˜λ©΄μ„œ λ‹€λ₯Ό λ•Œ, bit_1의 1의 갯수(cntOne)와 0의 갯수(cntZero)λ₯Ό λ”°λ‘œ μ €μž₯ν–ˆλ‹€. cntOneκ³Ό cntZero 쀑 더 μž‘μ€ κ°’ 만큼 κ΅ν™˜ν•΄μ£Όκ³  λ‚˜λ¨Έμ§€λŠ” λ°˜λŒ€κ°’μœΌλ‘œ λ°”κΎΈμ–΄μ£Όλ©΄ κ°„λ‹¨ν•˜κ²Œ 값을 찾을 수 μžˆλ‹€. 

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” cntOne은 2, cntZeroλŠ” 1이닀. 더 μž‘μ€ 값은 1μ΄λ―€λ‘œ 1번 1κ³Ό 0을 κ΅ν™˜ν•΄μ€€λ‹€. 그리고 cntOne - cntZero 번 1을 0으둜 λ°”κΎΈμ–΄ μ£Όμ—ˆλ‹€.

μ½”λ“œ


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_BOJ_12782_λΉ„νŠΈμš°μ •μ§€μˆ˜ {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer stringTokenizer;

        int testCase = Integer.parseInt(br.readLine());

        while(testCase-- > 0){
            stringTokenizer = new StringTokenizer(br.readLine());

            char[] bit1 = stringTokenizer.nextToken().toCharArray();
            char[] bit2 = stringTokenizer.nextToken().toCharArray();

            int cntOne = 0;
            int cntZero = 0;
            for(int i = 0; i < bit1.length; i++){
                if(bit1[i] != bit2[i]){
                    if(bit1[i] == '1')
                        cntOne++;
                    else
                        cntZero++;
                }
            }

            if(cntZero < cntOne){
                sb.append(cntZero + (cntOne - cntZero)).append("\n");
            }
            else if(cntOne < cntZero){
                sb.append(cntOne + (cntZero - cntOne)).append("\n");
            }
            else{
                sb.append(cntOne).append("\n");
            }
        }

        System.out.print(sb);
    }
    
}
728x90
λ°˜μ‘ν˜•