새소식

PS/백준

[백준/1322] X와 K (Python)

  • -

Problem : https://www.acmicpc.net/problem/1948

 

1948번: 임계경로

첫째 줄에 도시의 개수 n(1 ≤ n ≤ 10,000)이 주어지고 둘째 줄에는 도로의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 도로의 정보가 주어진다. 처음에는 도로의

www.acmicpc.net

 

Difficulty : Gold 4

 

Status : Solved

 

Time : 00:13:58

 


 

문제 설명

 

더보기

 

두 자연수 X와 K가 주어진다. 그러면, 다음 식을 만족하는 K번째로 작은 자연수 Y를 찾아야 한다.

X + Y = X | Y

|는 비트 연산 OR이다.

 

 

입력 및 출력

 

더보기

입력

 

첫째 줄에 X와 K가 주어진다. X와 K는 2,000,000,000보다 작거나 같은 자연수이다.

 

출력

 

첫째 줄에 X + Y = X | Y를 만족하는 K번째 작은 Y를 출력한다. 정답은 231-1 보다 클 수도 있다.

 

입력 예시

 

5 1

 

출력 예시

 

2

 

 


 

풀이

 

X + Y = X | Y 가 성립하려면, X, Y를 2진법으로 나타내었을 때 각 자릿수에 대해...

 

  • X(n) = 1일때 Y(n) = 0
  • X(n) = 0일때 Y(n) = 0 or 1

 

이 성립된다. bitwise OR은 자리올림 carry가 발생하지 않기 때문에, 덧셈에서 자리올림이 발생하는 유일한 경우인 1 + 1이 모든 자릿수에서 발생하지 않을 때만이 위 등식이 성립한다. 즉 X가 0인 자릿수를 모두 구하여, 경우의 수에 따라 Y를 계산하면 된다.

 

 

풀이 코드

x, k = map(int, input().split())
length = len(bin(x)[2:])
cnt = 1 << bin(x)[2:].count('0')

ans = 0
if k >= cnt :
  ans = (1 << length)*(k // cnt)
  k %= cnt

idx = 0
for i in range(length) :
  if not x & (1 << i) :
    if k & (1 << idx) :
      ans += (1 << i)
    idx += 1
print(ans)

풀이 완료!

'PS > 백준' 카테고리의 다른 글

[백준/2477] 참외밭 (Python)  (0) 2023.11.19
[백준/1719] 택배 (Python)  (0) 2023.11.17
[백준/1948] 임계경로 (Python)  (1) 2023.11.14
[백준/1740] 일하는 세포 (Python)  (1) 2023.11.13
[백준/1119] 그래프 (Python)  (1) 2023.11.12
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.