밀렸던 릿코드 풀기 (232, 150, 739, 2966, 1291)
릿코드 문제가 영어라 접근하기 쉽지 않지만 그래도 풀어보면 자료구조에 대해 이해할 수 있어서 좋은점이 많다.

첫문제는 비교적 쉬운 문제이다.
232. Implement Queue using Stacks
처음에 접근할 때는 HashSet 을 사용해보려고 했는데 순서가 보장이 안되더라.. 왜냐하면 내부적으로 해시테이블을 구현하는데 해시함수에 의해서 순서가 달라진다. LinkedHashSet을 이용하면 풀 수 있을거 같다.(+ 정렬되어있다면 TreeSet을 이용할 수 있다. 추가, 삭제, 조회 작업시 O(logn) 으로 수행된다. ) 근데 접근하기 편한 ArrayList 를 써서 풀었다. 😎
Time Complexity
push - O(1)
pop - O(n) //비효율적
peek - O(1)
empty - O(1)
Space Complexity
push
- 추가되는 건 : O(1)
- 그 외 모든 Space Complexity : O(n)
pop - O(1)
peek - O(1)
empty - O(1)
class MyQueue { private ArrayList<Integer> al = null; public MyQueue() { al = new ArrayList<>(); } public void push(int x) { al.add(x); } public int pop() { if (al.size() != 0) { int a = al.get(0); al.remove(0); return a; } return -1; } public int peek() { return al.get(0); } public boolean empty() { if (al.size() == 0) { return true; } return false; } } /** * Your MyQueue object will be instantiated and called as such: * MyQueue obj = new MyQueue(); * obj.push(x); * int param_2 = obj.pop(); * int param_3 = obj.peek(); * boolean param_4 = obj.empty(); */
문제에서 다르게 접근하신 분들이 있어서 가져와봤다.
문제는 push 에서 O(n) 으로 수행된다.
내꺼랑 또이또이 한걸지도..?
class MyQueue { private Stack<Integer> s1; private Stack<Integer> s2; public MyQueue() { s1 = new Stack<>(); s2 = new Stack<>(); } public void push(int x) { while (!s1.isEmpty()) { s2.push(s1.pop()); } s1.push(x); while (!s2.isEmpty()) { s1.push(s2.pop()); } } public int pop() { return s1.pop(); } public int peek() { return s1.peek(); } public boolean empty() { return s1.isEmpty(); } }
150. Evaluate Reverse Polish Notation
두번째 문제는 부호연산자가 같이 들어올 때 숫자 연산 처리에 대한 것이다.
반복문 한번에 처리 가능했다.
Time, Space Complexity - O(n)
이건 다른 풀이도 봤는데 전형적인 문제풀이라서 생략한다 !
class Solution { public int evalRPN(String[] tokens) { Stack<Integer> stack = new Stack<>(); for(int i=0; i<tokens.length; i++) { String token = tokens[i]; if(token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) { int top = stack.pop(); int second = stack.pop(); switch (token) { case "+" : stack.push(top+second); break; case "-" : stack.push(second-top); break; case "*" : stack.push(top*second); break; case "/" : stack.push(second/top); break; } } else { stack.push(Integer.parseInt(tokens[i])); } } //end of for loop return stack.pop(); } }
마지막 문제는 현재 인덱스를 기억하고 있어야 하는 문제이다. 이전이랑 비교해서 값이 큰지 비교하는 문제이다. 단순히 for loop을 돈다고 해결되는 문제는 아니다. 비교대상은 커져도 된다. 약간 투포인트 같은 느낌..?
Time Complexity : O(n)
Space Complexity : O(n)
class Solution { public int[] dailyTemperatures(int[] temperatures) { Stack<Integer> stack = new Stack<>(); int[] answer = new int[temperatures.length]; for(int i=0; i<temperatures.length; i++) { while(stack.size() != 0 && temperatures[i] > temperatures[stack.peek()] ) { int a = stack.pop(); answer[a] = i - a; } stack.push(i); } return answer; } }
2966. Divide Array Into Arrays With Max Difference
처음에 접근할 때는 이차원 배열 안에 배열 값 자체를 만들어서 k만큼 차이가 있는지 비교했는데 한번 돌 때 비교하면 쉽게 풀어지더라.
Time Complexity - O(nlogn)
Arrays.sort 가 퀵소트 알고리즘이랑 유사하다.
Space Complexity - O(n/3) - O(n)
2차원 배열을 할당하는데 n/3 만큼 할당한다.
class Solution { public int[][] divideArray(int[] nums, int k) { Arrays.sort(nums); int a = nums.length/3; int[][] b = new int[a][3]; int num = 0; for(int i=1; i<=nums.length; i++) { b[num][i%3] = nums[i-1]; if(i%3 == 0) { num ++; } } for(int i=0; i<a; i++) { for(int j=1; j<3; j++) { if(Math.abs(b[i][j]-b[i][j-1]) > k) { return new int[0][]; } } } return b; } }
to - be
import java.util.Arrays; class Solution { public int[][] divideArray(int[] nums, int k) { Arrays.sort(nums); if (nums.length % 3 != 0) return new int[0][]; int a = nums.length / 3; int[][] b = new int[a][3]; int index = 0; // 부분 배열의 인덱스 for (int i = 0; i < nums.length; i += 3) { if (i + 2 < nums.length && nums[i + 2] - nums[i] <= k) { b[index][0] = nums[i]; b[index][1] = nums[i + 1]; b[index][2] = nums[i + 2]; index++; } else { return new int[0][]; } } return b; } }
이 문제는 low, high 범위 안에 있는 문제를 필터링 하는 것이다. 순차적 숫자는 각 자리의 숫자가 이전 자리의 숫자보다 하나씩 더 큰 특성이 있다.
9-i 는 순차적 숫자를 구성할 때 각 자리는 이전 자리보다 1만큼 크기 때문에 숫자의 시작점과 길이를 기반으로 가능한 모든 숫자를 순차적으로 생성해야 한다.
Time Complexity - O(1)
nlow부터 nhigh까지 반복되기 때문에 nhigh-nlow+1 만큼 반복한다.
내부루프도 최대 9회이다.
Space Complexity - O(n)
ArrayList에 low 부터 high사이에 존재하는 순차적 숫자값을 저장한다.
class Solution { public List<Integer> sequentialDigits(int low, int high) { List<Integer> answer = new ArrayList<>(); String k = "123456789"; int nlow = String.valueOf(low).length(); int nhigh = String.valueOf(high).length(); for (int i=nlow; i<=nhigh; i++) { for(int j=0; j<=9-i; j++) { int num = Integer.parseInt(k.substring(j, j+i)); if (num >= low && num <= high) { answer.add(num); } } } return answer; } }
다음에 보고 조금 더 생각해볼 수 있는 부분이 있다면 업데이트 해야겠다.. (미리미리 풀기)

'알고리즘' 카테고리의 다른 글
35. Search Insert Position (0) | 2024.06.07 |
---|---|
979. Distribute Coins in Binary Tree (0) | 2024.05.19 |
kakao_광고삽입 (0) | 2021.12.06 |
kakao_표편집 (0) | 2021.12.06 |
kakao_합승택시요금 (0) | 2021.12.06 |
댓글
이 글 공유하기
다른 글
-
35. Search Insert Position
35. Search Insert Position
2024.06.07 -
979. Distribute Coins in Binary Tree
979. Distribute Coins in Binary Tree
2024.05.19 -
kakao_광고삽입
kakao_광고삽입
2021.12.06 -
kakao_표편집
kakao_표편집
2021.12.06
댓글을 사용할 수 없습니다.