알고리즘/백준

[파이썬, 자바] BOJ_12782(비트 우정지수)

딱따구르리 2021. 2. 1. 17:44
728x90
반응형

문제

 

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

 

12782번: 비트 우정지수

진홍이는 숫자를 좋아한다. 오늘도 숫자를 가지고 놀던 진홍이는 두 숫자의 비트 우정지수를 구해보았다. 비트 우정지수란, 10진법으로 나타낸 두 정수를 이진수로 나타내었을 때, 두 숫자를 같

www.acmicpc.net


 

해설

 

이 문제는 입력받은 두 이진수를 같게 만드는 최소 횟수를 구하는 문제이다.

 

두 이진수를 같게 만드는 방법은 두가지가 있다.

  1. 하나의 이진수에서 임의의 자리의 숫자를 0 또는 1로 바꾼다.
  2. 하나의 이진수에서 서로 다른 자리에 있는 두 숫자의 위치를 바꾼다.

이거 자체를 코드로 표현하려고 하면 어렵다.

머리를 좀 써보면, 

이진수1(n)과 이진수2(m)를 문자 하나씩 비교를 해서 문자가 다를 경우를 체크해주는 것이다.

n이나 m 둘 중 하나를 기준으로 잡고,

문자가 다를 경우,

그 문자가 0(zero)인지 1(one)인지를 체크하여 그에 맞는 변수의 값을 +1 해주는 것이다.

 

직접 손으로 케이스를 비교해가면서 횟수를 세보면

one과 zero 중 큰 수가 최소 연산 횟수가 된다는 것을 알 수 있다.

 


코드

 

-파이썬

#백준 12782(비트 우정지수)
import sys
input = sys.stdin.readline

t = int(input())  #테스트 케이스 개수

for _ in range(t):
    n, m = map(str, input().split())  # 이진수1, 이진수2
    one = 0
    zero = 0
    for i in range(len(m)):
        if n[i] != m[i]:
            if m[i] == '1':
                one += 1
            else:
                zero += 1
    print(max(one, zero))

 

-자바

//백준 12782(비트 우정지수)
import java.util.*;
import java.io.*;

public class Boj_12782 {

	public static void main(String[] args) throws IOException{
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();  //테스트 케이스 개수

		for (int i = 0; i < t; i++) {
			String n = sc.next();  //이진수 1
			String m = sc.next();  //이진수 2
			
			int one = 0;
			int zero = 0;
			
			for (int j = 0; j < m.length(); j++) {
				if (n.charAt(j) != m.charAt(j)) {
					if(m.charAt(j) == '1') {
						one ++;
					}
					else {
						zero ++;
					}
				}
			}
			
			System.out.println(Math.max(one, zero));
		}
	}

}
728x90
반응형