2016년 10월 1일 토요일

BOJ 1322 X와 K

자연수 X와 K가 주어지면
X + Y = X | Y 를 만족하는 K번째로 작은 Y를 구해야 하는데,
일단 X+Y는 일반적인 덧셈이고, X|Y는 비트 or 연산이기 때문에 X+Y = X|Y가 되려면
X와 Y를 비트로 나타냈을 때, 겹치는 1이 없으면
X+Y = X|Y가 될 것이다. 겹치는 1이 있을 경우 X|Y를 하면 그냥 똑같이 1이 되지만, X+Y를 하면 덧셈이 되기 때문이다.
그렇다면 X와 K가 주어지면, 일단 X를 비트로 바꾼 후, 비트가 1인 부분은 0으로 채우고, 비트가 0인 부분을 (K-1)값의 비트로 채워주면 될 것이다.... 가 아니라 K값의 비트로 채워줘야 한다. 이 문제에 Y값의 조건은 나와있지 않지만 예제를 보면 Y값은 자연수인 것으로 보인다.
자연수라면 0은 안되기 때문에 K값의 비트로 채워줘야 K번째로 작은 수가 될 것이다.

그리고 내가 처음 고민했던 것이 만약 Y의 조건이 정수라면? 그럴 경우에는 이렇게 간단하게 못 풀 것 같다. Y가 음수인 경우가 좀 처리하기 힘들어 보인다.
예를 들어 4 + -6 == 4 | -6 이다.

일단 Y는 자연수라고 알고 풀어야겠다.
비트연산에 익숙하지 않아서 그런지 구현하는 게 좀 까다로웠다.
WA를 받았다... 예제도 넣어보고 살펴보다 보니... long long형을 썼는데, 1<<i 할 때 1dp LL을 안 붙여주는 실수를 했다. 고쳐서 AC를 받았다.


댓글 없음:

댓글 쓰기