From 92e634eb9572abc0d73382483a2c45d0c3e71a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=9E=AC=EC=A0=95=20=5B=EC=BA=90=ED=85=8C?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=5D?= Date: Mon, 2 Sep 2024 21:12:18 +0900 Subject: [PATCH 1/7] valid palindrome solution --- valid-palindrome/jaejeong1.java | 51 +++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 valid-palindrome/jaejeong1.java diff --git a/valid-palindrome/jaejeong1.java b/valid-palindrome/jaejeong1.java new file mode 100644 index 000000000..b3aa05229 --- /dev/null +++ b/valid-palindrome/jaejeong1.java @@ -0,0 +1,51 @@ +class SolutionValidPalindrome { + + public boolean isPalindrome(String s) { + // 대문자를 소문자로 변환 + // 영문자와 숫자만 남기고 모두 제거 + // 앞뒤로 읽어도 같은 경우 팰린드롬 + // 종류 별 처리 방법 + // 영어 대문자: 소문자로 변환 + // 공백: 무시 + // 소문자, 숫자: 통과 + // 그 외: 무시 + // 종료 조건: lt >= rt + // 시간복잡도: O(N), 공간복잡도: O(N) + var lt = 0; + var rt = s.length() - 1; + + var input = s.toCharArray(); + + while (lt < rt) { + // 영문 또는 숫자일때까지 lt++ + while(!Character.isLetterOrDigit(input[lt]) && lt < input.length - 1) { + lt++; + } + + // 대문자면 소문자로 변환 + if (Character.isUpperCase(input[lt])) { + input[lt] = Character.toLowerCase(input[lt]); + } + + // 영문 또는 숫자일때까지 rt-- + while(!Character.isLetterOrDigit(input[rt]) && rt > 0) { + rt--; + } + + // 대문자면 소문자로 변환 + if (Character.isUpperCase(input[rt])) { + input[rt] = Character.toLowerCase(input[rt]); + } + + // lt, rt 범위가 겹쳤거나 lt와 rt 가 다르면 false 반환 + if (lt < rt && input[lt] != input[rt]) { + return false; + } + + lt++; + rt--; + } + + return true; + } +} \ No newline at end of file From 7c4ce77c82f0a56d02e4a112c14e79f9ef389feb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=9E=AC=EC=A0=95=20=5B=EC=BA=90=ED=85=8C?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=5D?= Date: Mon, 2 Sep 2024 21:21:08 +0900 Subject: [PATCH 2/7] missing number solution --- missing-number/jaejeong1.java | 15 +++++++++++++++ valid-palindrome/jaejeong1.java | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 missing-number/jaejeong1.java diff --git a/missing-number/jaejeong1.java b/missing-number/jaejeong1.java new file mode 100644 index 000000000..b8e21bbb1 --- /dev/null +++ b/missing-number/jaejeong1.java @@ -0,0 +1,15 @@ +class SolutionMissingNumber { + public int missingNumber(int[] nums) { + // N = 배열의 길이 + // 0 ~ N 의 합을 구하고, nums의 모든 값을 다 빼면 정답 + // 시간복잡도: O(N), 공간복잡도: O(1) + var N = nums.length; + var sum = (N * (N+1)) / 2; + + for (var num : nums) { + sum -= num; + } + + return sum; + } +} diff --git a/valid-palindrome/jaejeong1.java b/valid-palindrome/jaejeong1.java index b3aa05229..df93f2d09 100644 --- a/valid-palindrome/jaejeong1.java +++ b/valid-palindrome/jaejeong1.java @@ -48,4 +48,4 @@ public boolean isPalindrome(String s) { return true; } -} \ No newline at end of file +} From a95ca38f63963e0bf71e79c7e29b6fab42ec7f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=9E=AC=EC=A0=95=20=5B=EC=BA=90=ED=85=8C?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=5D?= Date: Mon, 2 Sep 2024 22:17:06 +0900 Subject: [PATCH 3/7] longest consecutive sequence solution --- longest-consecutive-sequence/jaejeong1.java | 46 +++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 longest-consecutive-sequence/jaejeong1.java diff --git a/longest-consecutive-sequence/jaejeong1.java b/longest-consecutive-sequence/jaejeong1.java new file mode 100644 index 000000000..25a0ba955 --- /dev/null +++ b/longest-consecutive-sequence/jaejeong1.java @@ -0,0 +1,46 @@ +import java.util.HashSet; +import java.util.Set; + +class SolutionLongestConsecutiveSequence { + + public int longestConsecutive(int[] nums) { + // 정렬되지 않은 정수 nums 배열이 주어지면 가장 긴 연속 요소 시퀀스 길이를 반환 + // O(N) 시간 내 실행되야함 + // 전부 해시맵에 때려넣고, 키를 꺼내 연속 요소가 있는지 확인한다 + // 연속 요소가 있으면 answer를 1 증가시키고, 연속 요소는 제거한다 + // 시간복잡도: O(N), 공간복잡도: O(N) + + Set set = new HashSet<>(); + for (var num : nums) { + set.add(num); + } + var answer = 0; + for (var num : nums) { + var length = 1; + + if (set.contains(num-1)) { + set.remove(num); + var minusKey = num; + while (set.contains(--minusKey)) { + length++; + set.remove(minusKey); + } + } + + if (set.contains(num+1)) { + set.remove(num); + var plusKey = num; + while (set.contains(++plusKey)) { + length++; + set.remove(plusKey); + } + } + + if (length > answer) { + answer = length; + } + } + + return answer; + } +} From b9db47b6123f27261fb71272a7291494ea684dbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=9E=AC=EC=A0=95=20=5B=EC=BA=90=ED=85=8C?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=5D?= Date: Tue, 3 Sep 2024 16:29:43 +0900 Subject: [PATCH 4/7] =?UTF-8?q?valid=20palindrome=20=EA=B3=B5=EA=B0=84?= =?UTF-8?q?=EB=B3=B5=EC=9E=A1=EB=8F=84=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- valid-palindrome/jaejeong1.java | 53 ++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/valid-palindrome/jaejeong1.java b/valid-palindrome/jaejeong1.java index df93f2d09..e4b08c0a2 100644 --- a/valid-palindrome/jaejeong1.java +++ b/valid-palindrome/jaejeong1.java @@ -5,45 +5,50 @@ public boolean isPalindrome(String s) { // 영문자와 숫자만 남기고 모두 제거 // 앞뒤로 읽어도 같은 경우 팰린드롬 // 종류 별 처리 방법 - // 영어 대문자: 소문자로 변환 // 공백: 무시 // 소문자, 숫자: 통과 // 그 외: 무시 // 종료 조건: lt >= rt - // 시간복잡도: O(N), 공간복잡도: O(N) - var lt = 0; - var rt = s.length() - 1; + // 시간복잡도: O(N), 공간복잡도: O(1) + var idxLt = 0; + var idxRt = s.length() - 1; - var input = s.toCharArray(); + char charLt; + char charRt; - while (lt < rt) { - // 영문 또는 숫자일때까지 lt++ - while(!Character.isLetterOrDigit(input[lt]) && lt < input.length - 1) { - lt++; - } + while (idxLt < idxRt) { + charLt = s.charAt(idxLt); + charRt = s.charAt(idxRt); - // 대문자면 소문자로 변환 - if (Character.isUpperCase(input[lt])) { - input[lt] = Character.toLowerCase(input[lt]); + // 영문 또는 숫자일때까지 lt++ + while(!Character.isLetterOrDigit(charLt) && idxLt < s.length() - 1) { + idxLt++; + charLt = s.charAt(idxLt); } // 영문 또는 숫자일때까지 rt-- - while(!Character.isLetterOrDigit(input[rt]) && rt > 0) { - rt--; + while(!Character.isLetterOrDigit(charRt) && idxRt > 0) { + idxRt--; + charRt = s.charAt(idxRt); } - // 대문자면 소문자로 변환 - if (Character.isUpperCase(input[rt])) { - input[rt] = Character.toLowerCase(input[rt]); - } + // 대문자면 소문자로 변환 + lt, rt 범위가 겹쳤거나 lt와 rt 가 다르면 false 반환 + if (idxLt < idxRt) { + if (Character.isUpperCase(charLt)) { + charLt = Character.toLowerCase(charLt); + } + + if (Character.isUpperCase(charRt)) { + charRt = Character.toLowerCase(charRt); + } - // lt, rt 범위가 겹쳤거나 lt와 rt 가 다르면 false 반환 - if (lt < rt && input[lt] != input[rt]) { - return false; + if (charLt != charRt) { + return false; + } } - lt++; - rt--; + idxLt++; + idxRt--; } return true; From f7571032d6ea8717a31ac65c8c23b5ec35130756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=9E=AC=EC=A0=95=20=5B=EC=BA=90=ED=85=8C?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=5D?= Date: Tue, 3 Sep 2024 19:46:11 +0900 Subject: [PATCH 5/7] word search solution --- word-search/jaejeong.java | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 word-search/jaejeong.java diff --git a/word-search/jaejeong.java b/word-search/jaejeong.java new file mode 100644 index 000000000..c421aaff4 --- /dev/null +++ b/word-search/jaejeong.java @@ -0,0 +1,50 @@ +class SolutionWordSearch { + + int[] dx = new int[]{0, 0, -1, 1}; + int[] dy = new int[]{-1, 1, 0, 0}; + + public boolean exist(char[][] board, String word) { + // 상하좌우 방문 여부 체크하면서 DFS 탐색 + // index 기준으로 word와 비교하면서 같을 때만 추가 탐색 + // 시간복잡도: O(N) > 방문 여부 체크하면서 기방문한 곳은 탐색하지 않기 때문 + // 공간복잡도: O(1) > 별도 메모리 할당하지 않음 + for (int i = 0; i < board.length; i++) { + for (int j = 0; j < board[0].length; j++) { + if (dfs(board, i, j, word, 0)) { + return true; + } + } + } + return false; + } + + public boolean dfs(char[][] board, int x, int y, String word, int index) { + if (index >= word.length()) { + return true; + } + // board 밖이면 return false + if (x >= board.length || y >= board[0].length || x < 0 || y < 0) { + return false; + } + // 이미 방문했거나 정답 조건에 맞지 않으면 return false + if (board[x][y] != word.charAt(index)) { + return false; + } + + // 현재 위치의 문자를 임시로 변경하여 방문 처리 + char temp = board[x][y]; + board[x][y] = '#'; + + index++; + for (int i = 0; i < 4; i++) { + if (dfs(board, x + dx[i], y + dy[i], word, index)) { + return true; + } + } + + // 방문 처리를 되돌림 + board[x][y] = temp; + + return false; + } +} From c49237b42fad789d3137dc50dce79e60a3b4b45d Mon Sep 17 00:00:00 2001 From: jaejeong1 <89735640+jaejeong1@users.noreply.github.com> Date: Thu, 5 Sep 2024 13:11:48 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=EC=8B=9C=EA=B0=84=EB=B3=B5=EC=9E=A1?= =?UTF-8?q?=EB=8F=84=20=ED=91=9C=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- word-search/jaejeong.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/word-search/jaejeong.java b/word-search/jaejeong.java index c421aaff4..2e582e361 100644 --- a/word-search/jaejeong.java +++ b/word-search/jaejeong.java @@ -6,7 +6,7 @@ class SolutionWordSearch { public boolean exist(char[][] board, String word) { // 상하좌우 방문 여부 체크하면서 DFS 탐색 // index 기준으로 word와 비교하면서 같을 때만 추가 탐색 - // 시간복잡도: O(N) > 방문 여부 체크하면서 기방문한 곳은 탐색하지 않기 때문 + // 시간복잡도: O(M * N * 4^L) > M: board 행, N: board 열, 4: 상하좌우 4방향, L: word의 길이 // 공간복잡도: O(1) > 별도 메모리 할당하지 않음 for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { From 232f11a39a5dc0969eb0b78bf224a8484687bdfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=9E=AC=EC=A0=95=20=5B=EC=BA=90=ED=85=8C?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=5D?= Date: Fri, 6 Sep 2024 13:45:54 +0900 Subject: [PATCH 7/7] =?UTF-8?q?word=20search=20=EA=B3=B5=EA=B0=84=EB=B3=B5?= =?UTF-8?q?=EC=9E=A1=EB=8F=84=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- word-search/jaejeong.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/word-search/jaejeong.java b/word-search/jaejeong.java index 2e582e361..25648e847 100644 --- a/word-search/jaejeong.java +++ b/word-search/jaejeong.java @@ -7,7 +7,7 @@ public boolean exist(char[][] board, String word) { // 상하좌우 방문 여부 체크하면서 DFS 탐색 // index 기준으로 word와 비교하면서 같을 때만 추가 탐색 // 시간복잡도: O(M * N * 4^L) > M: board 행, N: board 열, 4: 상하좌우 4방향, L: word의 길이 - // 공간복잡도: O(1) > 별도 메모리 할당하지 않음 + // 공간복잡도: O(L) > word의 길이 for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { if (dfs(board, i, j, word, 0)) {