[BOJ] 12782번: 비트 우정지수

rany·2021년 2월 23일
0

Baekjoon Online Judge

목록 보기
24/26

✔️ 문제

진홍이는 숫자를 좋아한다. 오늘도 숫자를 가지고 놀던 진홍이는 두 숫자의 비트 우정지수를 구해보았다. 비트 우정지수란, 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을 넘지 않으며, 자릿수는 서로 같다.

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

😎 소스 코드

T = int(input())
line = 0
answer = []

while line != T:
	diff = []
	count0, count1 = 0, 0

	# get friendship case
	N, M = input().split()
	
	# find different bits
	for char in range(len(N)):
		if N[char] != M[char]:
			diff.append(N[char])
	
	# check 0, 1
	for bit in range(len(diff)):
		if diff[bit] == '0':
			count0 += 1
		else:
			count1 += 1

	answer.append(max(count0, count1))
	line += 1

for ans in answer:
	print(ans)

✊ 문제를 풀고 나서

로직 짜는 것 보다 파이썬 문법 때문에 시간이 많이 걸린 문제였다 ㅠ

profile
개발개발

0개의 댓글