From 57b816f09e1521350ab0c004c35affdd50061d82 Mon Sep 17 00:00:00 2001 From: rivkode Date: Tue, 9 Dec 2025 00:52:24 +0900 Subject: [PATCH 1/4] rivkode container with most water --- container-with-most-water/rivkode.java | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 container-with-most-water/rivkode.java diff --git a/container-with-most-water/rivkode.java b/container-with-most-water/rivkode.java new file mode 100644 index 0000000000..280b3f09f5 --- /dev/null +++ b/container-with-most-water/rivkode.java @@ -0,0 +1,39 @@ +/* +1. 문제이해 +배열의 숫자들 중 2개의 수를 구해서 가장 많이 담을 수 있는 물의 양을 구한다 +이때 두 수중 작은 수를 기준으로 작은수 * 배열간의 거리 = 물의 양 으로 계산된다. + +2. 예외케이스 + +3. 알고리즘 +투포인터 + +4. 구현 +두개의 포인터를 양쪽에 두고 최대값을 구하는 것이므로 두개의 포인터중 작은 값을 가지는 포인터를 반대방향으로 이동시킨다. +왜냐하면 큰 값을 가지는 포인터를 이동시켜버리면 그 다음 물의 양은 이전보다 클 수 없기 때문이다. + +*/ + +import java.util.*; + +class Solution { + public int maxArea(int[] height) { + int maxArea = 0; + int s = 0; + int e = height.length - 1; + + while (s < e) { + // 물의 양 + int area = (e - s) * Math.min(height[s], height[e]); + maxArea = Math.max(area, maxArea); + // 포인터 이동 + if (height[s] > height[e]) { + e -= 1; + } else { + s += 1; + } + } + + return maxArea; + } +} From 35a5bb7dcc5ab3eb3595267004e61f992dabb92a Mon Sep 17 00:00:00 2001 From: rivkode Date: Tue, 9 Dec 2025 20:09:12 +0900 Subject: [PATCH 2/4] rivkode best time to buy and sell --- best-time-to-buy-and-sell-stock/rivkode.java | 52 ++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 best-time-to-buy-and-sell-stock/rivkode.java diff --git a/best-time-to-buy-and-sell-stock/rivkode.java b/best-time-to-buy-and-sell-stock/rivkode.java new file mode 100644 index 0000000000..c4c9eb7ef0 --- /dev/null +++ b/best-time-to-buy-and-sell-stock/rivkode.java @@ -0,0 +1,52 @@ +/* +1. 문제 이해 +주식을 가장 작은 값에 사서 최고값에 팔아야 한다. +단순히 주식에서 최고값을 파는게 아니다. 구매 시간과 판매 시간이 정해져있으므로 반드시 산 시각보다 후에 팔아야 한다. + +2. 알고리즘 +2중 for loop ? + +3. 구현 + +포인터를 하나씩 왼쪽에서 오른쪽으로 이동하며 이후 오른쪽 값들을 대입하여 뺴본다. 즉 무식하게 다 돈다 + +4. 예외 +만약 모든 값이 음수라면 0을 리턴한다 +10만이라서 2중 루프 돌면 시간초과 나지 않을까 ? +-> 아 .. 200/212 케이스에서 Time limit Exceeded 발생하네 + +그러면 다른 알고리즘으로 접근해야한다. +답지 참고 +직관을 이용해야하네 +i 번째 시기에 최대 수익을 얻으려면 i 번째 날 전 중 최저가를 찾아서 빼면 된다. +*/ + +import java.util.*; + +class Solution { + public int maxProfit(int[] prices) { + int max = 0; + int min = prices[0]; + + for (int i=1; i Date: Tue, 9 Dec 2025 20:49:32 +0900 Subject: [PATCH 3/4] rivkode group anagrams --- group-anagrams/rivkode.java | 87 +++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 group-anagrams/rivkode.java diff --git a/group-anagrams/rivkode.java b/group-anagrams/rivkode.java new file mode 100644 index 0000000000..28b5fc1222 --- /dev/null +++ b/group-anagrams/rivkode.java @@ -0,0 +1,87 @@ +/* +1. 문제 이해 +strs로 들어오는 인풋들에 대해 동일한 문자를 사용해서 대체할 수 있는지 체크 +대체할 수 있으면 하나의 그룹으로 묶어서 List 생성 +생성한 그룹들을 모아서 다시 하나의 2차원 리스트로 반환 + +2. 알고리즘 +2중 for loop인데 조건을 보니까 +탐색을 10^4 * 100 이면 10^6 이므로 1,000,000 이니까 +해볼만 한 것 같다. + +3. 구현 +각 글자들을 정렬해서 기존과 같은 인덱스를 가지는 hashmap 생성 + +글자가 같은지 비교 +같은 글자의 인덱스를 체크해서 기존 리스트에서 해당 글자를 넣음 +없으면 본인만 넣음 + +반환 + +아니다 .. +답지 참고하니 HashMap을 사용하고 있네 +Map에서 key 로 sorted 된 단어를 넣고 value 로 일치하는 단어 리스트를 넣는다. + +이렇게 되면 한번만 for loop 를 도는것이므로 리스트에서 제거하거나 하는 일이 없어도 된다. +그리고 구현도 깔끔하게 그리고 이해하기 쉽게 구현된다. + +4. 예외 +없을 경우 본인 넣기 +글자는 소문자만 존재 + +*/ + +import java.util.*; + +class Solution { + public List> groupAnagrams(String[] strs) { + Map> anagrams = new HashMap<>(); + + for (int i=0; i()); + } + List list = anagrams.get(sorted); + list.add(w); + } + + return new ArrayList<>(anagrams.values()); + + // List originLst = new ArrayList<>(); + // Map hash = new HashMap<>(); + // List> answer = new ArrayList<>(); + + // for (int i=0; i tmp = new ArrayList<>(); + // String s = orderLst.get(i); + // // 정답에 넣기 + // tmp.add(originLst.get(i)); + // for (int j=i; j Date: Tue, 9 Dec 2025 20:52:42 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EC=84=A4=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group-anagrams/rivkode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/group-anagrams/rivkode.java b/group-anagrams/rivkode.java index 28b5fc1222..8f27ae5cfd 100644 --- a/group-anagrams/rivkode.java +++ b/group-anagrams/rivkode.java @@ -19,8 +19,8 @@ 반환 아니다 .. -답지 참고하니 HashMap을 사용하고 있네 -Map에서 key 로 sorted 된 단어를 넣고 value 로 일치하는 단어 리스트를 넣는다. +답지 참고하니 단순히 HashMap의 key value를 인덱스, 정렬된 단어가 아니라 +HashMap에서 key 로는 sorted 된 단어를 넣고 value 로는 List를 만들어서 일치하는 단어 리스트를 넣고 있네. 이렇게 되면 한번만 for loop 를 도는것이므로 리스트에서 제거하거나 하는 일이 없어도 된다. 그리고 구현도 깔끔하게 그리고 이해하기 쉽게 구현된다.