1. 문제

 

3개의 자연수 a, b, c가 주어진다.

a와 b를 or 연산한 값을 c와 같게 만들기 위해서 몇 개의 bit를 0에서 1로 또는 1에서 0으로 전환시켜야 하는지 출력하면 된다.

 


 

2. 풀이 과정

 

모든 수를 오른쪽으로 시프트시키며 1을 가리키는 bit만 확인한다.

모든 수가 0이 되면 while문을 빠져나간다.

 

c의 bit가 1이라면 a와 b 중 하나만 1이면 되므로 c에서 (a | b)를 빼주면 필요한 1의 개수가 나온다.

c의 bit가 0이라면 a와 b 두 bit를 더하면 전환해야 하는 개수가 나온다.

 

while문을 반복하는 동안 각 개수들을 모두 더해서 while문이 끝나면 반환한다.

 

public class Solution {
    public int MinFlips(int a, int b, int c)
    {
        var result = 0;

        while(a > 0 || b > 0 || c > 0)
        {
            if ((c & 1) == 1)
            {
                result += (c & 1) - ((a & 1) | (b & 1));
            }
            else
            {
                result += (a & 1) + (b & 1);
            }

            a = a >> 1;
            b = b >> 1;
            c = c >> 1;
        }

        return result;
    }
}

 

 

 

반응형