티스토리 뷰
Algorithm/LeetCode
[LeetCode - Daily Challenge] 201. Bitwise AND of Numbers Range
Jaime.Lee 2021. 10. 14. 10:30Problem
Given two integers left and right that represent the range [left, right], return the bitwise AND of all numbers in this range, inclusive.
Example 1:
Input: left = 5, right = 7
Output: 4
Example 2:
Input: left = 0, right = 0
Output: 0
Example 3:
Input: left = 1, right = 2147483647
Output: 0
Constraints:
0 <= left <= right <= 23^1 - 1
Solution
두 개의 숫자가 주어졌을 때 두 수를 포함해서 사이에 존재하는 모든 숫자를 AND 연산하여 나오는 값을 반환하는 문제입니다.
범위 내에서 비트 AND 연산은 실제로 left과 right의 두 숫자만으로 일부 연산을 수행해 구할 수 있습니다.
예제 1번에서 처럼 5와 7은 이진법으로 각각 101과 111이고 [5, 7]의 결과는 5 & 6 & 7 = 101 & 110 & 111 입니다.
left와 right의 숫자가 같아질 때까지 왼쪽에서 오른쪽으로 이동한 뒤 뒷자리를 0으로 채우는 것과 동일합니다.
5와 7로 예를 들면 아래와 같습니다.
101, 111을 두 비트가 같이질 때까지 오른쪽으로 이동
(0) 101
(0) 111
(1) 10
(1) 11
(2) 1
(2) 1
1에 이동한 횟수만큼 0을 더해줌
답: 100
이를 소스 코드로 나타내면 아래와 같습니다.
public class Solution {
public int rangeBitwiseAnd(int left, int right) {
int move = 0;
while (left != right) { // (1)
left >>= 1;
right >>= 1;
move++;
}
return right << move; // (2)
}
}
- 두 수가 같아질 때까지 오른쪽으로 한 비트씩 shift 하면서 이동한 갯수를 카운트
- 같아진 수에서 이동한 비트 수만큼 다시 왼쪽으로 shift
Test
package io.lcalmsky.leetcode.bitwise_and_of_numbers_range;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SolutionTest {
@Test
void givenNumbers_whenGetBitwiseAndOfNumbersRange_thenCorrect() {
assertAll(
() -> test(5, 7, 4),
() -> test(0, 1, 0),
() -> test(1, 2147483647, 0)
);
}
private void test(int a, int b, int expected) {
// when
Solution bitwiseAndOfNumbersRange = new Solution();
int actual = bitwiseAndOfNumbersRange.rangeBitwiseAnd(a, b);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode - Daily Challenge] 1008. Construct Binary Search Tree from Preorder Traversal (0) | 2021.10.16 |
---|---|
[LeetCode - Daily Challenge] 543. Diameter of Binary Tree (0) | 2021.10.15 |
[LeetCode - Daily Challenge] 208. Implement Trie (Prefix Tree) (0) | 2021.10.10 |
[LeetCode - Daily Challenge] 79. Word Search (0) | 2021.10.09 |
[LeetCode - Daily Challenge] 442. Find All Duplicates in an Array (0) | 2021.10.07 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- r
- Linux
- Java
- 클린 아키텍처
- 스프링 부트 튜토리얼
- Jackson
- gRPC
- spring boot application
- leetcode
- QueryDSL
- 스프링 부트
- spring boot app
- spring boot jwt
- JPA
- Spring Boot
- @ManyToOne
- 알고리즘
- Spring Boot Tutorial
- 함께 자라기 후기
- 스프링 부트 애플리케이션
- intellij
- 스프링 부트 회원 가입
- 스프링 데이터 jpa
- JSON
- Spring Boot JPA
- proto3
- Spring Data JPA
- 헥사고날 아키텍처
- 함께 자라기
- 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함