[BOJ] 12782번: 비트 우정지수
✔️ 문제
진홍이는 숫자를 좋아한다. 오늘도 숫자를 가지고 놀던 진홍이는 두 숫자의 비트 우정지수를 구해보았다. 비트 우정지수란, 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을 넘지 않으며, 자릿수는 서로 같다.
[출력]
각 테스트 케이스마다 두 수의 비트 우정지수를 출력한다.
😎 소스 코드
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)
✊ 문제를 풀고 나서
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)
로직 짜는 것 보다 파이썬 문법 때문에 시간이 많이 걸린 문제였다 ㅠ
Author And Source
이 문제에 관하여([BOJ] 12782번: 비트 우정지수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rany/BOJ-12782번-비트-우정지수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)