Leetcode 279

[BinaryTreeGeneral][Easy] 100. Same Tree

https://leetcode.com/problems/same-tree/description Q. 주어진 두 tree가 동일한 tree인지 판단하라.    Solution.  이런 경우엔 직관적으로 생각해 본다.  두 tree가 같기 위해선 leaf의 모양과 해당 data가 같아야 한다.  모양이 같다는 의미는 존재하는 위치가 같아야 한다는 것이며, empty leaf를 처리할 수 있으면 결국 판단 가능하다는 것이다.   BFS로 tree leaf를 순회하여 결과를 비교한다.  코드 더보기 List BFS(TreeNode node){ List ret = new List(); if(node == null) return ret; Queue buff = new Queue(); buf..

[LinkedList][Medium] 86. Partition List

https://leetcode.com/problems/partition-list/description  Q. 리스트가 주어질 때, x 보다 작은 값, 큰 값으로 노드를 구분하고 연결하라.  Solution.  해당 값을 기준으로 node를 재연결 하고,  해당 두 connection head를 연결해 준다.   코드. 더보기public ListNode Partition(ListNode head, int x) { ListNode node = head; ListNode part1 = null, part2 = null; ListNode n1 = null, n2 = null; while(node != null) { if(node.val   결과.

[LinkedList][Medium] 61. Rotate List

https://leetcode.com/problems/rotate-list/description  Q 주어진 리스트를 k 회 회전하라.   Solution 회전의 결과는 우선, 뒤에서 k 번째 노드를 찾아서 해당 노드를 head로 만들면 된다.   따라서 뒤에서 k 번째 노드를 찾고 새로운 head로 만든다.  기존 list의 tail 노드의 next를 기존 head에 연결한다.  k번째 노드의 앞노드는 새로운 tail 이 되므로 next를 null로 set 한다.   따라서 기본적으로 뒤에서 k 번째 노드를 찾는 문제와 매우 유사.   다만, k 가 리스트 길이보다 긴 경우, 리스트 길이로 정규화를 먼저 한다.  코드 더보기 public ListNode RotateRight(ListNode head, ..

[LinkedList][Medium] 82. Remove Duplicates from Sorted List II

https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/description Q. 정렬된 리스트에서 중복된 값을 가진 노드를 제거하고 결과 노드를 출력하라. Solution.  중복된 노드를 검색하고, 해당 노드 전후 처리 link 를 잘 해 주는 것이 핵심이라 하겠다.  다만, 중복노드 이전 노드를 알아야 중복이 끝난 지점 노드에 연결을 해 주므로, 이를 어떻게 처리하느냐  등이 조금 신경 쓸 여지가 있는 부분이 될 터이다.   최대한 현재 노드 기준으로 문제를 국한시키며, 단순화하는데 노력을 써 본다.  더보기 public ListNode DeleteDuplicates(ListNode head) { const int INIT = ..

[LinkedList][Medium] 92. Reverse Linked List II

https://leetcode.com/problems/reverse-linked-list-ii/description  Q. list가 주어지고, left, right 가 주어질 때, 이 left, right만 list를 뒤집어라.   Solution.  리스트 뒤집기 함수를 먼저 만든다, 그리고 연결 부분에 신경 쓴다.  더보기 public class Solution { public ListNode ReverseBetween(ListNode head, int left, int right) { --left; --right; int idx = 0; ListNode nodeResume = findNode(head, right+1); ListNode..

[LinkedList][Medium] 138. Copy List With Random Pointer

https://leetcode.com/problems/copy-list-with-random-pointer/description   Q. list가 주어질 때, 이 list의 노드는 next와 random pointer를 가지고 있다.  이 list를 깊은 복사를 하고, 그 결과를 반환하라.  Solution.  복잡해 보이지만 간단한 문제.  list를 그냥 복사하고, random에 대해 복사한 대상에 대해 같은 복사대상을 pointing하게 해 주면 된다.   문제는 복사대상을 찾는 과정인데,  어떤 최적화를 거친것을 문제가 원하는가, 아니면 모든 대상에 대해 그냥 O(N)탐색을 허용하는가 하는 것이다.   결과적으로 별 최적화 없이 해도 accpected 되었다.  더보기 public class S..

[Stack][Hard] 224. Basic Calculator

https://leetcode.com/problems/basic-calculator/description Q. 괄호와 기본 +, - 연산을 지원하는 기본 계산기를 구현하라.    Solution.  단순해 보이지만, 조금 문제에 대해 세부 파악이 필요한 문제다.  괄호로 인한 계산 우선 순위, 부호에 의한 값 반전 등 고려해야 할 것들이 있다.   숫자는 부호를 포함해 한덩어리로 생각하기로 한다.  그러면 괄호로 둘러싸인 숫자의 연속이 된다.   닫는 괄호가 나오면, 열린 괄호를 만날때까지 숫자를 더해 준다.  이때 마이너스 값은 음수로 더해 질 것이다.  다만, 괄호를 만나 마감하기 전, 한번 더 그 앞 기호를 확인해 음수이면 최종값을 stack에 반영하기 전에  다시 음수 전환 해 준다.   위 로직..

Leetcode/Challenges 2024.05.13

[Stack][Medium] 150. Evaluate Reverse Polish Notation

https://leetcode.com/problems/evaluate-reverse-polish-notation/description Q. 주어진 token과 같은 수식이 주어질 때, 결과를 도출 하여 반환하라.   Solution.  stack을 처리하는 방식의 1차원 적인 문제.  기호가 나오면 가장 가까운 숫자 2개를 pop해서 stack에 다시 집어 넣고  다음 연산에 사용한다.  public int EvalRPN(string[] tokens) { Stack buff = new Stack(); for(int q = 0; q    결과.

[Stack][Medium] 71. Simplify Path

https://leetcode.com/problems/simplify-path/description Q. 주어진 / path 를 간단화한 방식으로 재정리 하라.   Solution.  '/', '..' , '.' 등에 의한 operation 처리가 필요하다.  이때 이 operation의 바로 앞 path 를 처리하는 것이므로, 마지막 input path data가 필요하다.  따라서 stack style 자료구조가 필요.   역시 먼저 최대한 단순화 해 본다.    주어진 string에서 slash를 제외하고 단어를 뽑아 본다.   그리고 그 중에서 path name, operation 등을 구분하여 처리한다.   마지막으로 stack은 반대로 data가 쌓이므로, 이를 유의하여 최종 데이터를 만든다...

[Interval][Medium] 57. Insert Interval

https://leetcode.com/problems/insert-interval/description Q. 주어진 구간 정보배열 intervals가 있고, 추가 될 구간 newInterval 이 있다. 이때 newInterval을 추가한 상태로 새로운 구간 정보를 구성하라.  Solution.  그냥 있는 그대로의 상태에서 바로 이런 저런 시도를 하려다 보니, 풀이 시간이 길어졌다.  최대로 복잡한 구간을 최대한 간결한 코드로 풀어내는 것이 코딩문제 풀이의 핵심이다.  이것도 최대한 그렇게 해 본다.   주어진 구간 interval은 이미 정렬된 구간 데이터 이다.  따라서 새 구간 정보를 주어진 데이터에 넣으면 되는데, 이때 아래의 규칙에 따른다.   우선 새 구간 정보와 기존 index 순서대로 구..

Leetcode/Challenges 2024.05.09