diff --git a/longest-substring-without-repeating-characters/jaejeong1.java b/longest-substring-without-repeating-characters/jaejeong1.java new file mode 100644 index 00000000..1ed9c6ce --- /dev/null +++ b/longest-substring-without-repeating-characters/jaejeong1.java @@ -0,0 +1,55 @@ +import java.util.HashSet; +import java.util.Set; + +class SolutionLongestSubstring { + + public int lengthOfLongestSubstring(String s) { + // 반복되는 문자열 중 가장 긴 문자열의 길이를 반환해라 + + // s.length = 0 또는 1이면 return s.length() + // lt = 0, rt = 1 + // s[lt] != s[rt] 이면 SubString 여부를 검사하고 True면 rt++, count++ + // s[lt] == s[rt] 이면 쌓인 카운트 정답에 적용하고 lt++, rt=lt+1, count 초기화 + // rt가 끝에 도달하면 그때까지 쌓인 정답 반환 + + // TC: O(N*M), 전체 문자열 길이 N * 부분 문자열 길이 M + // SC: O(M), 부분 문자열 생성 공간 + + if (s.length() <= 1) { + return s.length(); + } + + int lt = 0; + int rt = lt + 1; + int answer = 0; + int count = 0; + while (rt <= s.length()) { + while (rt <= s.length() && isSubstring(s.substring(lt, rt))) { + count++; + rt++; + } + answer = Math.max(answer, count); + + lt++; + rt = lt + 1; + count = 0; + } + return answer; + } + + // TC: O(M), 부분 문자열 str에 중복이 없는 경우 str의 길이 + // SC: O(M), 부분 문자열 str의 중복이 없는 경우 str의 길이 + private boolean isSubstring(String str) { + Set set = new HashSet<>(); + set.add(str.charAt(0)); // 첫번째 문자는 바로 add + // 두번째 문자부터 중복 검사 대상 + for (int i = 1; i < str.length(); i++) { + // 중복 문자가 있거나, 공백이면 바로 false 리턴 + if (!set.add(str.charAt(i)) || str.charAt(i) == ' ') { + return false; + } + } + + return true; + } +} diff --git a/number-of-islands/jaejeong1.java b/number-of-islands/jaejeong1.java new file mode 100644 index 00000000..f6844569 --- /dev/null +++ b/number-of-islands/jaejeong1.java @@ -0,0 +1,41 @@ +class SolutionNumberOfIslands { + char[][] sharedGrid; + int[] dx = new int[]{0, 0, -1, 1}; + int[] dy = new int[]{-1, 1, 0, 0}; + + public int numIslands(char[][] grid) { + // 풀이 + // 네 모서리가 물로 둘러쌓여있으면 아일랜드 + // 아일랜드의 개수를 반환해라 + // 땅인 경우 DFS 돌려서 순회하자 + // 상하좌우 확인하면서 땅이면 물로 변경하면서 순회한다 + // DFS 1회 당 answer += 1 + // TC: O(N), N은 배열 원소 개수 + // SC: O(N) + var answer = 0; + + sharedGrid = grid; + for (int i=0; i= 0 && y >= 0 && x < sharedGrid.length && y < sharedGrid[0].length && sharedGrid[x][y] == '1') { + dfs(x, y); + } + } + } +} diff --git a/reverse-linked-list/jaejeong1.java b/reverse-linked-list/jaejeong1.java new file mode 100644 index 00000000..b0e29dd2 --- /dev/null +++ b/reverse-linked-list/jaejeong1.java @@ -0,0 +1,33 @@ + +//Definition for singly-linked list. +class ListNode { + int val; + ListNode next; + ListNode() {} + ListNode(int val) { this.val = val; } + ListNode(int val, ListNode next) { this.val = val; this.next = next; } +} + +class SolutionReverseLinkedList { + public ListNode reverseList(ListNode head) { + // 풀이: 링크드리스트 방향을 현재 기준으로 뒤집고, 노드를 다음으로 옮기며 반복한다 + // next = curr.next + // prev > curr + // prev < curr + // prev = curr + // curr = next + // TC: O(N), head 길이 N만큼 + // SC: O(1), prev/curr 2개만 메모리 사용 + + ListNode prev = null; + ListNode curr = head; + while(curr != null) { + ListNode next = curr.next; + curr.next = prev; + prev = curr; + curr = next; + } + + return prev; + } +}