Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions best-time-to-buy-and-sell-stock/rivkode.java
Original file line number Diff line number Diff line change
@@ -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<prices.length; i++) {
int profit = prices[i] - min;
max = Math.max(profit, max);
// 어떻게 항상 Min을 찾을까 하였지만 루프를 돌때마다 i 를 기준으로 min을 찾아내면 됨
min = Math.min(prices[i], min);
}

// for (int i=0; i<prices.length - 1; i++) {
// for (int j=i; j<prices.length; j++) {
// int buy = prices[i];
// int sell = prices[j];
// int profit = sell - buy;
// if (profit <= 0) {
// continue;
// }
// max = Math.max(max, profit);
// }
// }

return max;
}
}
39 changes: 39 additions & 0 deletions container-with-most-water/rivkode.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
87 changes: 87 additions & 0 deletions group-anagrams/rivkode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*
1. 문제 이해
strs로 들어오는 인풋들에 대해 동일한 문자를 사용해서 대체할 수 있는지 체크
대체할 수 있으면 하나의 그룹으로 묶어서 List 생성
생성한 그룹들을 모아서 다시 하나의 2차원 리스트로 반환

2. 알고리즘
2중 for loop인데 조건을 보니까
탐색을 10^4 * 100 이면 10^6 이므로 1,000,000 이니까
해볼만 한 것 같다.

3. 구현
각 글자들을 정렬해서 기존과 같은 인덱스를 가지는 hashmap 생성

글자가 같은지 비교
같은 글자의 인덱스를 체크해서 기존 리스트에서 해당 글자를 넣음
없으면 본인만 넣음

반환

아니다 ..
답지 참고하니 단순히 HashMap의 key value를 인덱스, 정렬된 단어가 아니라
HashMap에서 key 로는 sorted 된 단어를 넣고 value 로는 List를 만들어서 일치하는 단어 리스트를 넣고 있네.

이렇게 되면 한번만 for loop 를 도는것이므로 리스트에서 제거하거나 하는 일이 없어도 된다.
그리고 구현도 깔끔하게 그리고 이해하기 쉽게 구현된다.

4. 예외
없을 경우 본인 넣기
글자는 소문자만 존재

*/

import java.util.*;

class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> anagrams = new HashMap<>();

for (int i=0; i<strs.length; i++) {
String w = strs[i];

char[] arr = w.toCharArray();
Arrays.sort(arr);
String sorted = new String(arr);

if (!anagrams.containsKey(sorted)) {
anagrams.put(sorted, new LinkedList<>());
}
List<String> list = anagrams.get(sorted);
list.add(w);
}

return new ArrayList<>(anagrams.values());

// List<String> originLst = new ArrayList<>();
// Map<Integer, String> hash = new HashMap<>();
// List<List<String>> answer = new ArrayList<>();

// for (int i=0; i<strs.length; i++) {
// String s = strs[i];
// originLst.add(s);
// char[] cArr = s.toCharArray();
// Arrays.sort(cArr);
// String orS = new String(cArr);
// hash.put(i, orS);
// }

// for (int i=0; i<orderLst.size(); i++) {
// List<String> tmp = new ArrayList<>();
// String s = orderLst.get(i);
// // 정답에 넣기
// tmp.add(originLst.get(i));
// for (int j=i; j<orderLst.size(); j++) {
// String compare = orderLst.get(j);
// if (s.equals(compare)) {

// // 정답에 넣기
// tmp.add(originLst.get(j));
// }
// }
// answer.add(tmp);
// }

// return answer;
}
}