본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 비트 우정지수 : 12782번 - Python

728x90
반응형

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

 

12782번: 비트 우정지수

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

www.acmicpc.net

 

 

 

문제의 접근 방법

 

- 이진수 n과 이진수 m을 문자 하나씩 비교해서 문자가 다를 경우를 체크해주기

- n이나 m 둘 중 하나를 기준점으로 삼아서 문자가 다를 경우에 그게 0인지 1인지 체크해서 총 몇 개인지 계산해주기

- 그 두 값중 더 큰 수가 바로 최소 연산횟수!

 

 

 

내가 막혔던 부분

 

- 기본적인 아이디어를 생각하지 못했음.

내가 생각한 아이디어: 두 수가 같지 않으면 무조건 한 번은 바꿔야 하기 때문에 1을 카운트 해주고, 그 후 1을 기준점으로 삼아서 1의 개수가 다르면 각 이진수 n, m이 가지고 있는 1의 개수들의 차이를 카운트해서 더해주는 것이 최소 연산 횟수라고 생각했다.

### 처음 내가 짰던 오답 코드 ###


T = int(input())

for _ in range(T):
    result = 0
    n,m = input().split()
    n = list(n)
    m = list(m)
    if n != m:
        result += 1
        if n.count('1') != m.count('1'):
            result += abs(n.count('1') - m.count('1'))

    print(result)

 

 

 

문제 풀이 방법

 

(1) 테스트 케이스 T 입력 받기

(2) 이진수 두 개 n,m을 문자열로 입력 받기

(3) 이진수 1과 0을 각각 몇 번씩 바꿔야 하는지 개수를 세서 저장해줄 변수 one, zero 선언하기

(4) 만약 이진수 n의 i번째 요소가 m의 i번째 요소와 다르다면 n을 기준으로 m의 i번째 값이 (0->1)로 바뀌어야 하는지, 아니면 (1->0)으로 바꿔야 하는지 판별해서 바꿔야 하는 수(one or zero)에 1씩 카운트 해주기

(5) (4) 과정을 이진수(문자열) 길이만큼 반복하기

(6) 바꿔야 하는 횟수 one 이나 zero 두 개를 비교해서 더 큰 수를 출력해주기

 

 

 

소스코드

T = int(input())

for _ in range(T):
    n,m = map(str, input().split())
    one = 0
    zero = 0
    for i in range(len(n)):
        if n[i] != m[i]:
            if m[i] == '1':
                one += 1
            else:
                zero += 1
                
    print(max(one, zero))
728x90
반응형