본문 바로가기

HARD56

[leetcode][42] Trapping Rain Water 문제 : https://leetcode.com/problems/trapping-rain-water/ 땅의 고도를 나타내는 배열이 주어질 때, 비가 내린 후 가둘 수 있는 물의 양을 구해라. 예시로 주어진 [0,1,0,2,1,0,1,3,2,1,2,1] 을 한 번 살펴보자. 예시의 5 인덱스를 보면 가둘 수 있는 물의 양은 양 옆에 있는 고도가 아닌 인덱스 5를 기점으로 왼쪽에 있는 고도 중 가장 높은 것(leftMax)과 오른쪽에 있는 고도 중 가장 높은 것(rightMax)이 관계가 있다. leftMax와 rightMax를 구했다면 이들 중 더 낮은 고도 - 탐색 중인 고도가 가둘 수 있는 물의 양이다. 인덱스 5를 예로 들면 leftMax = 2(index 3). rightMax = 3(index 7).. 2020. 8. 22.
[leetcode][295] Find Median from Data Stream 문제 : https://leetcode.com/problems/find-median-from-data-stream/ 정렬된 배열의 중앙값을 찾아라. 만약 배열에 짝수개 있다면 중앙값 2개의 평균값을 구해라. addNum(num) num을 배열에 추가한다. findMedian() 배열의 중앙값을 구하라. 최소힙, 최대힙 으로 푸는 유명한 문제. 왼쪽에는 최대힙, 오른쪽에는 최소힙을 두고 addNum을 할 때 왼쪽 오른쪽 순으로 번갈아가며힙에 수를 넣어준다. 이 때, 왼쪽에 있는 최대힙 원소들은 오른쪽에 있는 최소힙에 있는 원소들보다 모두 작거나 같아야 한다. 따라서 addNum을 할 때 최소힙, 최대힙의 가장 위(앞)에 있는 수를 비교해서 최대힙에 있는 수가 최소힙에 있는 수보다 크다면 두 수를 바꿔서 넣.. 2020. 8. 17.
[leetcode][154] Find Minimum in Rotated Sorted Array II 문제 : https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/ 오름차순 정렬된 배열이 있을 때, 어떤 pivot으로 배열이 회전했다고 하자. ex) [0,1,2,3,4,5,6,7] -> [4,5,6,7,0,1,2,3] 회전된 배열이 주어질 때 가장 작은 수를 구하라. 배열안에 수는 중복될 수 있다. 33번 Search in Rotated Sorted Array 와 비슷하게 풀었다. 위 문제와 다른 점은 33번 문제는 회전된 배열에서 특정 수 target을 찾고 배열은 중복된 수가 없다. 왼쪽 오른쪽 배열 오름차순 오름차순 오름차순 (제일 작은수가 왼쪽에 위치) 오름차순 내림차순 제일 작은수가 오른쪽에 위치 내림차순 오름차순 제일 작.. 2020. 7. 26.
[leetcode][1044] Longest Duplicate Substring 문제 : https://leetcode.com/problems/longest-duplicate-substring/ 문자열 S가 주어지면 두 번 이상 발생하는 S의 모든 중복 된 하위 문자열들 중 가장 긴 문자열을 찾아라. binary search 로 정답이 가능한 하위 문자열 길이 범위를 줄여나간다. length를 문자열 길이의 하위 문자열이 문자열 S에 두 번 이상 발생하는지 확인할 때는 Rabin-Karp 알고리즘을 사용한다. 라빈 카프 알고리즘은 해시 기법을 사용한다. 문자열이 같은지 비교할 때 1차로 해시가 같은지 비교하고, 해시가 같을 때만 실제로 문자열이 같은지 비교한다. 자바에서 hashCode(), equals() 함수를 생각하면 이해하기 쉽다. 객체를 비교할 때 1차로 hashCode().. 2020. 6. 20.
[leetcode][72] Edit Distance 문제 : https://leetcode.com/problems/edit-distance/ word1에서 word2를 만들고자 한다. 최소 편집횟수를 구하라. 편집 방법은 총 3가지가 있다. 1) 문자 추가. 2) 문자 삭제. 3) 문자 대체(변경) 대표적 DP 문제 중 하나. dp[i][j] = word1[0..i]를 word2[0..j]로 만들 때 최소 편집횟수. word1[i], word2[j]가 같다면 dp[i][j] = dp[i-1][j-1]. word1[i], word2[j]가 다른경우 i) 문자 추가 : dp[i][j-1] + 1 ii) 문자 삭제 : dp[i-1][j] + 1 iii) 문자 대체 : dp[i-1][j-1] + 1 위 3가지 방법 중 최소값이 dp[i][j]가 된다. 이를 열우.. 2020. 6. 2.
[leetcode][45] Jump Game II 문제 : https://leetcode.com/problems/jump-game-ii/ 음수가 아닌 정수 배열이 주어진다. 배열 값은 그 인덱스에서 1번의 점프로 최대 몇 개의 인덱스를 이동할 수 있는지를 의미한다. 즉, arr[3] = 2인 경우 3인덱스에서 4, 5로 이동할 수 있다. (4, 5로 이동할 때 1번 점프로 이동가능을 의미) 0인덱스에서 시작할 때, 최소 몇 번의 점프로 마지막 인덱스까지 도달할 수 있는가. (마지막 인덱스까지 도달할 수 없는 경우는 없다고 한다.) 그리디로 해결가능하다. 0부터 탐색하면서 탐색 중인 인덱스까지 도달하기 위해 필요한 최소 점프횟수(ans), 최대로 이동할 수 있는 인덱스(maxInd), 그리고 임시 최대이동가능 인덱스(tmp)를 구한다. tmp는 임시로 저.. 2020. 4. 26.