본문 바로가기

전체 글

(124)
[Java] LeetCode 21번 Merge Two Sorted Lists 2개의 singly linked list를 merge하는 문제이다. 처음에는 while문으로 두개의 리스트에서 값을 비교해서 정답에 추가해준후에, 나중에 남아있는 list를 붙여준다. class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode cur = null; ListNode answer = null; while (l1 != null && l2 != null) { ListNode node; if (l1.val < l2.val) { node = new ListNode(l1.val); l1 = l1.next; } else { node = new ListNode(l2.val); l2 = l2.next; } if (c..
[Java] 위클리 챌린지 8주차 - 최소직사각형 sizes에 이차원 배열로 가로 세로의 값이 주어진다. 가로세로중 긴 길이를 가로로, 짧은 길이를 세로로 바꾸어서 각각 가로의 최대값과 세로의 최대값을 구한 후 이를 곱해주어 반환한다. class Solution { public int solution(int[][] sizes) { int answer = 0; int n = sizes.length; int maxWidth = 0; int maxHeight = 0; for(int i = 0; i < n; i ++){ maxWidth = Math.max(maxWidth, Math.max(sizes[i][0], sizes[i][1])); maxHeight = Math.max(maxHeight, Math.min(sizes[i][0], sizes[i][1])); ..
[Java] LeetCode 20번 Valid Parentheses Stack을 이용해서 쉽게 해결이 가능하다. 닫는 괄호가 나왔을 때, stack에서 pop한 값이 짝을 이루는 괄호가 아니라면 잘못된 괄호 쌍이 된다. class Solution { public boolean isValid(String s) { Deque stack = new LinkedList(); boolean result = true; for (int i = 0; i < s.length(); i++) { Character c = s.charAt(i); if (c == '(' || c == '{' || c == '[') { stack.push(c); } else { if (stack.size() == 0) { result = false; break; } Character popC = stack.pop..
[Java] LeetCode 19번 Remove Nth Node From End of List 싱글 링크트 리스트에서 뒤에서 n번째의 노드를 삭제하여 return 하는 문제이다. 자바에서 제공하는 List 자료구조를 사용하는 것이 아니라, 주어진 싱글 링크드 리스트인 ListNode를 사용해서 푸는 것이 핵심이라고 생각된다. 싱글 링크드 리스트이기 때문에 앞에서 몇번째인지는 알 수 있지만, 뒤에서 몇번째인지는 알기가 어렵다. 그래서 먼저 리스트의 사이즈를 구하고, 뒤에서 몇번째가아니라 앞에서 몇번째를 지우는 문제로 바꿔준다. 리스트의 사이즈가 1인 경우는 null을 리턴해줘야되고, 첫번째 노드를 지우는 경우에도 head.next를 return 해줘야된다. 이외에는 중간노드.next = 중간노드.next.next 로 값을 변경해주면 된다. class ListNode { int val; ListNod..
[Java] LeetCode 17번 Letter Combinations of a Phone Number 옛날 피처폰에 숫자위치에 있는 알파벳들의 가능한 조합을 모두 출력하는 문제이다. 이런 조합의 문제에서는 재귀호출을 통해서 쉽게 해결할 수 있다. 재귀 함수를 작성할 때 중요한 포인트는 언제 함수가 종료되는지 잘 명시하는 것이다. digits의 길이가 0이 되면 비어있는 리스트를 리턴하고, 1이라면 map에서 조회하여 리턴한다. 이외의 경우에는 첫번째 숫자와 나머지 문자를 이어서 정답에 추가하여 리턴한다. class Solution { Map map = new HashMap(); { map.put("2", List.of("a", "b", "c")); map.put("3", List.of("d", "e", "f")); map.put("4", List.of("g", "h", "i")); map.put("5",..
[Java] LeetCode 15번 3Sum 배열에서 3개의 수의 합이 0이되도록하는 수의 집합을 찾는 문제이다. 먼저 배열을 정렬한 뒤에 2개의 수를 고정하고, 나머지 하나를 binary search로 찾는 방식을 택했다. 시간복잡도는 O(n^2 log(2))이다. 중복되는 집합을 피하기 위해서 전과 같은 수의 값이면 다음 값으로 넘어갈 수 있도록 continue 구문을 작성해주었다. class Solution { public List threeSum(int[] nums) { List answer = new ArrayList(); Arrays.sort(nums); int n = nums.length; for (int i = 0; i 0 && nums[i] == nums[i - 1]) continue; for (..
[Java] LeetCode 11번 Container With Most Water 막대기 2개로 둘러쌓인 부분의 넓이를 구하는 것이 문제이다. 작은 길이의 막대기가 기준이 되어 넓이가 구해지는 것이 문제의 포인트이다. 왼쪽 막대기의 위치를 l 오른쪽 막대기의 위치를 r로 두고, 왼쪽과 오른쪽 중 작은 길이의 막대기를 한칸씩 옮겨서 넓이의 최대값을 찾는다. 작은 것은 옮기는 이유는 더 큰 넓이가 되기 위해서는 작은 길이의 막대기가 길어져야되기 때문이다. class Solution { public int maxArea(int[] height) { int l = 0; int r = height.length - 1; int max = (r - l) * Math.min(height[l], height[r]); while (l < r) { if (height[l]
[Java] LeetCode 10번 Regular Expression Matching 1. dp를 사용하지 않는 풀이 isMatch 함수를 재귀적으로 호출하여 문제를 해결해보았다. 각각의 경우의 수는 주석으로 남겨두었다. 생각보다 복잡하고, 코드가 길어졌다. dp를 사용하지 않기 때문에 중복으로 같은 케이스를 확인하게 되므로 느리다. class Solution { public boolean isMatch(String s, String p) { boolean isPossible = false; // s가 남았는데 p가 없는 경우 if (s.length() > 0 && p.length() == 0) { return false; } // s와 p가 모두 소진된 경우 else if (s.length() == 0 && p.length() == 0) { return true; } if (p.leng..