-
30 Days of Code > Day29:Bitwise ANDAlgorithm/hackerrank 2018. 7. 31. 17:35
마무리 - 30 Days of Code > Day29:Bitwise AND
해커랭크의 tutorials 중 30 Days of Code의 마지막 날이다.
python 공부를 시작하고 30일 동안 큰 어려움 없이 꾸준히 할 수 있었다.
이런 학습 방식이 참 마음에 든다. 작지만 꾸준하게 할 수 있도록 작은 문제들을 부담없는 수준에서 하나씩 제시하고 또 한 문제 이상 풀 수 없도록 24시간마다 한 문제씩 open되는 방식이, 뭐랄까 작은 성공 경험을 느끼고 부담을 줄여서 꾸준히 할 수 있게끔 유도해 준다고 해야하다.
여튼 마지막 문제인 만큼 풀기는 했지만, 좀 더 나은 방법을 찾기위해서는 나름 생각이 필요한 문제여서 정리를 해본다.
(해결 후 discussions를 참고했다)
문제요약
Set S는 {1, 2, 3, ..., N}으로 주어지고, S에 속하는 A와 B(A<B)가 있을 때 A&B의 최댓값을 출력한다. 단 A&B는 주어진 K보다 작아야 한다. (K<=N)(1<=T<=10^3, 2<=N<=10^3, 2<=K<=N)Sample Input
3
5 2
8 5
2 2Sample Output
140풀이
처음 내가 풀었던 방식은 K-1과 나머지 원소들과의 &값 중 최댓값을 찾는 거였다. & 연산은 둘 중 작은 값보다 큰 값이 나올 수 없는 특징이 있기 때문에, K보다 작은 최댓값인 K-1과 나머지를 &하면 그 중 최댓값이 들어있을 거라는 생각이었다. 최종적으로 통과는 했으나, 검증이 부족함이 있었다. 그리고 다음 방법을 보게 되었다. 결국 이 방법에 의해 내가 푼 풀이도 정답이 나올 수 있었던 것이나, 실제로는 더 간단하게 풀 수 있는 문제였다.처음엔 이해가 어려웠으나 정리를 해보면,K가 홀수인 경우에는 K&(K-1)은 항상 K-1이 된다. 왜냐하면 K-1이 짝수이므로 첫 번째 bit는 0이다. 따라서 K는 K-1에서 첫 번째 bit만 1로 바뀌고 나머지는 같기 때문에 결국 K&(K-1) = K-1이된다.K가 짝수인 경우에는, 우선 K-1이 홀수이고 K-2가 다시 짝수가 되므로 위와 같은 논리로 K-2는 항상 나올 수 있다. 그러면 K가 짝수인 경우 K-1일 나올 수 있는 경우가 있는지 찾아야한다. 결과적으로 (K|K-1)&K-1 = K-1이 된다. or 연산이므로 K|(K-1)은 K-1의 모든 bit를 포함하고 K-1과 &를 하면 당연히 K-1이 나온다. 그럼 여기서 K|(K-1) <= N라면, K-1이 가능하고 아니면 K-2가 답이된다. 물론 K보다 큰 값을 선택해서 동일하게 나올 수 있지만 (K+0,1,...)|(K-1)이 가장 작은 경우가 K일 때이므로 K만 확인하면 된다.This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersimport math import os import random import re import sys if __name__ == '__main__': t = int(input()) for t_itr in range(t): nk = input().split() n = int(nk[0]) k = int(nk[1]) if k%2 == 1 or k|(k-1) <= n: print(k-1) else: print(k-2)