백준 12782 비트 우정지수 문제풀이 (JAVA)

0

문제 링크

문제


진홍이는 숫자를 좋아한다. 오늘도 숫자를 가지고 놀던 진홍이는 두 숫자의 비트 우정지수를 구해보았다. 비트 우정지수란, 10진법으로 나타낸 두 정수를 이진수로 나타내었을 때, 두 숫자를 같게 만드는데 필요한 최소 연산 횟수를 말한다. 연산의 종류는 다음과 같다.

하나의 이진수에서 임의의 자리의 숫자를 0 또는 1로 바꾼다.
하나의 이진수에서 서로 다른 자리에 있는 두 숫자의 위치를 바꾼다.
예를 들어, 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을 넘지 않으며, 자릿수는 서로 같다.

출력


각 테스트 케이스마다 두 수의 비트 우정지수를 출력한다.

풀이


생각보다 심플하게 풀었다. 각 자리수를 비교해서 값이 다를 때,
만약 num1기준으로 만약 1이면 trans0Count를 늘렸고, 0이면 trans1Count를 늘렸다. 그렇게 해서 더 값이 큰 값을 출력했다.

소스코드


import java.util.*;
import java.io.*;
public class Main{
    
    public static void main(String [] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        final int NUMBER_OF_TESTCASE = Integer.parseInt(br.readLine());
        for(int i=0;i<NUMBER_OF_TESTCASE;i++) {
            int trans0Count = 0,
                trans1Count = 0;
            
            st = new StringTokenizer(br.readLine());
            String num1 = st.nextToken(),
                   num2 = st.nextToken();
            
            for(int k=0;k<num1.length();k++) {
                if(num1.charAt(k) != num2.charAt(k)) {
                    if(num1.charAt(k) == '1') trans0Count++;
                    else trans1Count++;
                }
            }
            
            if(trans0Count >= trans1Count) sb.append(trans0Count); 
            else sb.append(trans1Count);
            
            sb.append("\n"); 
            
        }
        
        
        bw.write(sb.toString());
        
        bw.flush();
        br.close();
        bw.close();
        
    }

    
}

0개의 댓글

관련 채용 정보