Google 태그 관리자 아이콘
반응형

전체 글 177

.leetcode(238. Product of Array Except Self)

문제 https://leetcode.com/problems/product-of-array-except-self/ 문제 풀기 전 다 곱해서 하나씩 나누면 O(n)이나 나누기를 쓰지말라는 조건에 걸린다. 하나빼고 다 곱하면 O(n^2)으로도 풀 수는 있다. 그전까지의 곱을 모두 저장하고 있다면 계산이 좀 빠르지 않을까. 직접 푼 풀이 소요시간: 47분(21:08 ~ 21:55) 재도전하기 끝내 풀지 못했다. 느낀점 지금까지 문제를 30개정도 풀었는데 이건 진짜 멋진 문제다. 풀이에 대한 고정관념(다 곱한것에서 하나만 나눈다)를 막으니 분명 쉬운 문제같은데 풀리지가 않았다. 아직 멀었다. 그리고 솔루션을 확인하고 나서는 진짜 멋있는 문제라고 생각했다. 개념은 사실 left, right에 있었다. 꼭 다시 풀어..

알고리즘 풀이 2021.01.17

.leetcode(230. Kth Smallest Element in a BST)

문제 https://leetcode.com/problems/kth-smallest-element-in-a-bst/ 문제 풀기 전 kth 나오자 마자 bst는 보지못하고 priorityQueue라고 생각하였다. 순회해서 다 저장하고 priorityQueue로 해결할 수 있겠다. 다 오른쪽으로 줄세워서 priorityQueue로도 풀 수 있겠다. 94번 문제 풀이에서 사용했던 Morris Traversal를 이용해서이다. 직접 푼 풀이 소요시간: 7분(09:40 ~ 09:47) #1. 순회해서 다 저장하고 priorityQueue로 해결 class Solution { public int kthSmallest(TreeNode root, int k) { PriorityQueue pq = new PriorityQ..

알고리즘 풀이 2021.01.17

.leetcode(739. Daily Temperatures)

문제 https://leetcode.com/problems/daily-temperatures/ 문제 풀기 전 현재 시점에 영향주는 데이터는 지금의 데이터와 비교해서 높은 숫자가 나올때만 한번에 여러개에 영향을 주는걸 어떻게 풀것인가. 직접 푼 풀이 소요시간: 6분(18:07 ~ 18:13) class Solution { public int[] dailyTemperatures(int[] T) { int[] result = new int[T.length]; for(int i=0; i= T[stack.peek()]) stack.pop(); result[i]=stack.isEmpty() ? 0 : stack.peek()-i; stack.push(i); } return result; } }누적되는 알고리즘 접근 ..

알고리즘 풀이 2021.01.16

.leetcode(78. Subsets)

문제 https://leetcode.com/problems/subsets/ 문제 풀기 전 rescursive하게 풀되 중간중간에 저장하면 되겠다. 예전에 Permutations처럼 구하되, 중간중간에 저장만 잘하면 되겠는걸. 직접 푼 풀이 소요시간: 15분(10:46 ~ 11:01) class Solution { private Set result = new HashSet(); public List subsets(int[] nums) { result.add(new ArrayList()); doSubSets(nums, 0, new int[nums.length]); return result.stream().collect(Collectors.toList()); } private void doSubSets(int..

알고리즘 풀이 2021.01.16

.case(등록/해제/재등록 날짜 기록 프로세스)

고민 게시물에 대한 등록과 해제 및 재등록이 있는 경우 처리날짜를 어떻게 기록하면 좋을까. 결론 기획에 따라 방향을 정한다. 사실 이런 변경 테이블 데이터 변경이 일어난다면 로그 플랫폼을 분리해서 관리하는 3번이 가장 이상적으로 생각한다. 처음 구현이 복잡한데 이후로 처리할 잡다구리한 일들이 적어진다. 접근방법 하나의 테이블에서 관리 등록일/ 해제일/ 필드를 만든다. 등록하면 등록일에, 해제하면 해제일에 데이터를 저장한다. 재등록하면 기존 목록에서 등록일만 있는(해제일이 없고) 있는 목록이 있는지 확인한다. 없다면 등록을 허용한다. 이렇게 되면 하나의 주제에 대해서 여러개의 목록이 생길 수 있다. ex) 티스토리와 연동/ 등록일:2021-01-01/ 해제일:2021-01-10 티스토리와 연동/ 등록일:2..

.leetcode(46. Permutations)

문제 https://leetcode.com/problems/permutations/ 문제 풀기 전 딱보니 result는 전역변수로 해서 recursion이 끝날때마다 add하는 형식으로 해야겠다. 메소드를 하나 더 두고 index를 하나씩 추가해서 끝을 파악핟록 짜야겠다. 채워져가는 배열이 하나 더 있어야겠다. 직접 푼 풀이 소요시간: 14분 (11:56 ~ 12:10) class Solution { private List result; public List permute(int[] nums) { result = new ArrayList(); doPermute(nums, 0, new int[nums.length]); return result; } private void doPermute(int[] num..

알고리즘 풀이 2021.01.15

.leetcode(406. Queue Reconstruction by Height)

문제 https://leetcode.com/problems/queue-reconstruction-by-height/ 문제 풀기 전 가장 먼저 무얼 놓으면 변함이 가장 적을지를 고민했다. 숫자 크기가 큰 걸 고르면 아무래도 작은걸 먼저 선택했을때 보다 생각할 부분이 적어질 수 있다고 생각했다. 그런데 만약 같은 크기를 갖고 있으면 아무래도 앞에 있는 요소의 숫자가 적은것을 먼저 배치하는게 나중에 더 쉬울거라 생각해서 아래처럼 정렬을 해야겠다고 먼저 생각했다. // [7,0] // [7,0] [7,1] // [7,0] [6,1] [7,1] // [5,0] [7,0] [6,1] [7,1] // [5,0] [7,0] [5,2] [6,1] [7,1] // [5,0] [7,0] [5,2] [6,1] [4,4] [7..

알고리즘 풀이 2021.01.14

.case(일정 기간동안 게시글 노출여부)

고민 특정 목록을 일정 기간동안만 노출하고 싶을 때의 설계 방향에 대해 고민해보자. 결론 테이블 설계할때 시간 필드(startDate, endDate)가 꼭 필요한지 노출여부가 필요할지를 판단하면 된다. 배치를 이용하는 방법은 데이터의 시간텀이 크고(하루이상이나) 노출여부필드가 반드시 필요할 때 쓰인다. 날짜 필드를 이용하는 방법은 실시간성이 중요하고 좀 더 간편하게 방법으로 사용하고 싶을 때 쓰면 좋을거 같다. 접근방법 배치를 이용하는 경우 장점 캐쉬반영이 쉽다. 배치에서 노출여부가 변경되었을때를 evict시점을 정할 수 있다. 단점 반영 속도 측면: 배치의 실행시간 간격만큼 노출여부가 늦게 발생한다. 배치가 1시간마다 돌면 1시간의 텀을 두고 노출여부가 변경되고 배치가 1분만다 돌면 1분 텀으로 노출..

반응형