본문 바로가기

Algorithm

(51)
[Java] leetcode 92. Reverse Linked List II 구현한 코드이다. class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { if (head == null) { return null; } if (left == right) { return head; } ListNode cur = head; ListNode prev = new ListNode(); prev.next = head; for (int i = 0; i < left - 1; i++) { prev = cur; cur = cur.next; } for (int i = 0; i < right - left; i++) { ListNode next = cur.next; cur.next = next.next; next..
[c++] leetcode, 108. Convert Sorted Array to Binary Search Tree 정렬된 배열을 height-balanced binary tree로 변경하는 문제이다. 정렬된 배열의 가운데를 root 노드로 만들고, 가운데를 기준으로 왼쪽과 오른쪽 배열로 나눈다. 왼쪽과 오른쪽 배열에서 다시 sortedArrayToBST를 호출해주어 tree를 생성해주고 root node의 왼쪽과 오른쪽 child에 붙여주면 된다. class Solution { public: TreeNode *sortedArrayToBST(vector &nums) { if (nums.size() == 0) { return nullptr; } int mid = nums.size() / 2; TreeNode *root = new TreeNode(nums[mid]); vector left, right; for (int i..
[c++] leetcode 101. Symmetric Tree 왼쪽 child와 오른쪽 child가 서로 대칭인지 확인하는 문제이다. 대칭을 확인하는 코드를 구현하는 것이 다소 복잡할 것이라고 생각해서, 오른쪽 child를 대칭시키고, 대칭시킨 오른쪽 child가 왼쪽 child와 동일한지 확인하는 코드를 작성하였다. convert는 어떤 TreeNode를 대칭시키는 함수이다. isSameTreeNode는 어떤 두 TreeNode가 같은지 다른지 확인하는 함수이다. class Solution { public: void convert(TreeNode *root) { if (root == nullptr) return; TreeNode *tmp = root->left; root->left = root->right; root->right = tmp; convert(root..
[c++] LeetCode 84번 Largest Rectangle in Histogram stack에 (height, index) 를 쌍으로 저장해준다. heights를 순회하면서 stack의 top 보다 현재 height가 크다면 stack에 push해서 넣어준다. 만약 stack의 top보다 현재 height가 작다면 이 height 보다 작은 top이 나올 때 까지 pop을 해주고, pop을 하면서 height와 index로 직사각형의 너비를 계산해준다. top.height * ( i - top.index ) 가 직사각형의 너비가 되고 answer에 max를 취해서 큰 값만 가져간다. 현재 height보다 작은 top을 만났을 때, 다시 push를 해줘야하는데, 이때의 index는 현재 index가 아니라 마지막에 pop한 top의 index가 되어야한다. 왜냐하면 마지막에 pop한 t..
[c++] LeetCode 79번 Word Search backtracking을 이용해서 푸는 문제이다. 좌우상하 네가지 방향으로 이동할 수 있고, 한번 방문한 cell은 다시 방문하지 않는다. word의 시작점은 m*n grid의 어느곳이든 될 수 있으므로, 이중 for 문을 이용해서 탐색을 시도해야한다. find 라는 method를 정의해서 문제를 해결하였다. 현재까지 matching된 word의 index를 curDepth로 전달시켜준다. 그리고 좌우상하 네 방향을 탐색하고 curDepth를 하나 증가시켜 find를 재귀적으로 호출해준다. 이미 방문했던 곳은 다시 방문하면 안되므로, visted 라는 unordered map을 사용해서 관리를 중복 방문이 일어나지 않도록 관리를 하였다. #include #include #include #include #..
[c++] 41. First Missing Positive Set을 이용하면 쉽게 풀 수 있지만, 문제에서는 constant space만 사용하라고 되어있다. n에 의해서 크기가 변화되는, 즉 Set과 같은 자료구조를 이용해서 positive number 의 유무를 판별할 수 없다는 뜻이다. 문제에서 Missing Positive Number를 찾으라고 했으므로, 음수는 우리의 관심사밖이다. 그래서 해당 인덱스의 부호를 음으로 바꿔주는 것으로, 추가적인 space의 할당없이 숫자의 존재여부를 저장할 수 있다. class Solution { public: int firstMissingPositive(vector &nums) { int n = nums.size(); for (int i = 0; i < n; i++) { if (nums[i] n) { nums[i] =..
신고 결과 받기 - 2022 Kakao Blind Recruitment reportMap에 신고 당한 사람을 key로 신고한 사람들을 set으로 값을 저장해준다. set으로 저장하는 이유는 여러번 신고한 것을 무시하기 위함이다. function solution(id_list, report, k) { var answer = []; var reportMap = new Map(); let mailCntMap = new Map(); id_list.forEach(id =>{ reportMap.set(id, new Set()); mailCntMap.set(id, 0); }); report.forEach(line => { let spt = line.split(" "); let reporter = spt[0]; let reportee = spt[1]; reportMap.get(report..
2022 KAKAO 블라인드 채용 - 주차 요금 계산 (Java 풀이) OUT일 경우에는 같은 차량번호의 IN을 찾아야하는데, 나는 map을 이용해서 IN의 시각을 저장해주었다. OUT시각과 IN시각을 분 단위로 변경해준후에 map에 해당 차량번호의 주차시간 누적합을 저장해주었다. 요금 계산은 주차시간이 기본 시간보다 못미치는 경우에는 기본요금을, 초과하는 경우에는 문제에 나온대로 계산해서 추가해주었다. import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; class Solution { public Integer getMinutes(String time) { String[] spt = time.split(":"); Integer hours = Integ..