본문 바로가기

알고리즘 문제/Leetcode283

[leetcode][201] Bitwise AND of Numbers Range 문제 : https://leetcode.com/problems/bitwise-and-of-numbers-range/ 0 이상 2147483647 이하인 수 m, n(m 앞에서부터 자릿수를 비교해봤을 때, 다른 비트가 나오는 경우는 이후의 비트들도 AND연산을 하면 결국 0이된다고 추측할 수 있다. (prefix를 구해야한다.) m=101011(43), n=101111(47)을 예로 들어보자. 두 수의 prefix는 101000(40)이다. (prefix는 101 이지만 실제로 알고싶은건 101000 이기 때문에 편의상 이렇게 표현) 101011에서 101111이 되기 위해서는 4번째 자리의 0이 1이 되기 위한 과정이 필요하다. 이 때 4번째 자리 이후의 비트들은 모두 0이 될것이다. 즉, 다른 비트가 .. 2020. 4. 24.
[leetcode][1008] Construct Binary Search Tree from Preorder Traversal 문제 : https://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/ 이진 탐색 트리를 전위순회한 결과 배열을 입력값으로 받을 때, 이진 탐색트리를 구한 뒤 루트를 반환하라. 이진탐색트리는 왼쪽 자식 서브트리들의 노드는 루트 노드보다 작고, 오른쪽 자식 서브트리들의 노드들은 루트 노드보다 크다. 이를 이용해서 왼쪽 자식들과 오른쪽 자식들을 구분할 수 있다. 예를 들어, [8,5,1,7,10,12] 일때. 전위 순회이므로 8은 루트가 된다. 8 이후의 배열들 중 8보다 작은 값들은 [5, 1, 7] 이고 8보다 큰 값들은 [10, 12] 이다. 전위 순회이므로 나눈 배열들 중 가장 앞에 있는 요소가 루트의 왼쪽, 오른.. 2020. 4. 20.
[leetcode][33] Search in Rotated Sorted Array 문제 : https://leetcode.com/problems/search-in-rotated-sorted-array/ 오름차순으로 정렬된 중복되지 않은 요소들을 가진 배열이 있다. 이 배열을 어떤 인덱스에서 회전시킨다. 예를 들어, [0, 1, 2, 3, 4,5,6,7]은 [4, 5, 6, 7, 0, 1, 2, 3] 가 될 수도 있다. 회전된 배열이 주어질 때, 이 배열에서 target 값이 어디있는지 인덱스를 찾아라. 없다면 -1을 반환. 단, 시간복잡도는 O(logN) 이어야 한다. 이분 탐색으로 풀었다. 배열 [4 5 6 7 8 0 1] [5 1 2 3 4]로 예를 들어보자. 중간 인덱스를 기준으로 왼쪽과 오른쪽이 있고 이들이 오름차순인지 내림차순인지 구한다. 이 때, 오름차순과 내림차순은 배열을.. 2020. 4. 19.
[leetcode][238] Product of Array Except Self 문제 : https://leetcode.com/problems/product-of-array-except-self/ 1보다 큰 양수들의 배열이 주어질 때 output[i] = nums[i] 를 제외한 나머지 nums 요소들의 곱 인 output 배열을 구하라. 단, 나누기는 쓰지말고 출력배열을 제외하고는 추가 메모리를 사용하지 말아라. n = nums 배열 크기라 하자. output[i] = nums[0] ~ nums[i-1] 의 곱. => nums를 앞에서부터 탐색하면서 output[i] = output[i-1] * nums[i-1] nums[i] = nums[i] ~ nums[n-1] 의 곱. => nums를 뒤에서부터 탐색하면서 nums[i] = nums[i] * nums[i+1] output[i].. 2020. 4. 16.
[leetcode][678] Valid Parenthesis String 문제 : https://leetcode.com/problems/valid-parenthesis-string/ '(', ')', '*' 로 이루어진 문자열이 입력값으로 주어진다. *은 '(', ')'가 될 수 있고 빈 문자도 될 수 있다. * 가 특정 문자로 대체될 때, 괄호들의 쌍이 맞는 경우 유효한 문자열이라 한다. 입력 문자열이 유효한 문자열인지 판단해라. 여는 괄호가 나오는 인덱스를 저장하는 스택 하나와 '*' 가 나오는 인덱스를 저장하는 deque 하나를 사용한다. 입력된 문자열을 앞에서부터 탐색하면서 스택과 deque를 채운다. 1. 탐색중인 문자가 * 인 경우 deque의 뒤에 현재 인덱스를 채운다. 2. 여는 괄호인 경우 스택에 현재 인덱스를 push 한다. 3. 닫는 괄호인 경우 3-1. .. 2020. 4. 16.
[leetcode][525] Contiguous Array 문제 : https://leetcode.com/problems/contiguous-array/ 이진수 배열이 주어질 때, 0과 1의 개수가 같은 subarray의 최대 길이를 구하라. 부분합을 키로 하고 해당 부분합이 처음으로 나타난 위치(1이 시작점)를 value로 하는 map을 만든다. 0이 나오는 경우 합에 -1을 해주고 1이 나오는 경우 +1을 한다. 현재 탐색하고 있는 인덱스를 i라 하고 만약 이때까지 나온 부분합들 중 현재까지의 부분합(0~i)을 키로 하는 value가 있다면 i - value가 정답이 될 수 있는 경우이다. 예를 들어, 0011 이 있다면 subSum은 0 -1 -2 -1 0 이 된다. 가장 처음에 있는 0(시작)도 반드시 필요. 이 경우 정답이 될 수 있는 경우는 빨간색과,.. 2020. 4. 13.