반응형
Notice
Recent Posts
Recent Comments
- Today
- Total
작심삼일
[LeetCode] 421 | Maximum XOR of Two Numbers in an Array | Python 본문
728x90
반응형
문제 링크: https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/
문제
Given an integer array nums, return the maximum result of nums[i] XOR nums[j], where 0 <= i <= j < n.
조건
- 1 <= nums.length <= 2 * $10^5$
- 0 <= nums[i] <= $2^{31}$ - 1
내 풀이
Trie 구조를 사용한다.
Trie 구조란 문자열을 효과적으로 searching할 때 사용하는, 아래 그림과 같은 구조다.
'aaaa', 'aabc', 'abcd'의 세 문자열을 Trie 구조를 사용해서 저장하면 아래와 같이 표현된다.
XOR이 최대가 되기 위해서는 이진수로 표현했을 때, 각 자리수가 전부 다를 때 용이하다.
(ex. 0001 ^ 0000 = 0001, 0001 ^ 1111 = 1110)
이 문제를 풀기 위해서는 주어진 nums에 들어있는 모든 숫자를 이진수로 변환한 후 Trie에 저장한다.
Trie를 이용해 현재 수(num)를 이진수로 표현했을 때, XOR이 최대가 되어야하므로 반대의 길로 진행한다. (말로 표현하기 어려우니 아래 그림 참조)
'0101'이 입력으로 들어왔을 때, 각 자리수 별로 일치하지 않는 곳으로 내려가서 만나는 숫자가 XOR이 최대가 되는 수이다.
코드
class Solution:
def findMaximumXOR(self, nums: List[int]) -> int:
trie = {}
for num in nums:
node = trie
for i in range(31, -1, -1):
bit = (num >> i) & 1
if bit not in node:
node[bit] = {}
node = node[bit]
node['$'] = num
ans = 0
for num in nums:
node = trie
for i in range(31, -1, -1):
bit = (num >> i) & 1
if (1-bit) in node:
node = node[1-bit]
else:
node = node[bit]
ans = max(ans, num^node['$'])
return ans
728x90
반응형
'스터디 > 코테' 카테고리의 다른 글
[LeetCode] 454 | 4Sum II | Python (0) | 2022.02.03 |
---|---|
[LeetCode] 211 | Design Add and Search Words Data Structure (0) | 2022.01.28 |
[LeetCode] 1305 | All Elements in Two Binary Search Trees (0) | 2022.01.26 |
[LeetCode] 520 | Detect Capital | Python (0) | 2022.01.24 |
[백준] 3190번 | 뱀 | C++ (0) | 2022.01.20 |
Comments