Skip to content

Commit b10234a

Browse files
authored
Merge pull request #2159 from rivkode/main
[rivkode] WEEK 05 solutions
2 parents 93bc2f3 + e7870dc commit b10234a

File tree

3 files changed

+178
-0
lines changed

3 files changed

+178
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
1. 문제 이해
3+
주식을 가장 작은 값에 사서 최고값에 팔아야 한다.
4+
단순히 주식에서 최고값을 파는게 아니다. 구매 시간과 판매 시간이 정해져있으므로 반드시 산 시각보다 후에 팔아야 한다.
5+
6+
2. 알고리즘
7+
2중 for loop ?
8+
9+
3. 구현
10+
11+
포인터를 하나씩 왼쪽에서 오른쪽으로 이동하며 이후 오른쪽 값들을 대입하여 뺴본다. 즉 무식하게 다 돈다
12+
13+
4. 예외
14+
만약 모든 값이 음수라면 0을 리턴한다
15+
10만이라서 2중 루프 돌면 시간초과 나지 않을까 ?
16+
-> 아 .. 200/212 케이스에서 Time limit Exceeded 발생하네
17+
18+
그러면 다른 알고리즘으로 접근해야한다.
19+
답지 참고
20+
직관을 이용해야하네
21+
i 번째 시기에 최대 수익을 얻으려면 i 번째 날 전 중 최저가를 찾아서 빼면 된다.
22+
*/
23+
24+
import java.util.*;
25+
26+
class Solution {
27+
public int maxProfit(int[] prices) {
28+
int max = 0;
29+
int min = prices[0];
30+
31+
for (int i=1; i<prices.length; i++) {
32+
int profit = prices[i] - min;
33+
max = Math.max(profit, max);
34+
// 어떻게 항상 Min을 찾을까 하였지만 루프를 돌때마다 i 를 기준으로 min을 찾아내면 됨
35+
min = Math.min(prices[i], min);
36+
}
37+
38+
// for (int i=0; i<prices.length - 1; i++) {
39+
// for (int j=i; j<prices.length; j++) {
40+
// int buy = prices[i];
41+
// int sell = prices[j];
42+
// int profit = sell - buy;
43+
// if (profit <= 0) {
44+
// continue;
45+
// }
46+
// max = Math.max(max, profit);
47+
// }
48+
// }
49+
50+
return max;
51+
}
52+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
1. 문제이해
3+
배열의 숫자들 중 2개의 수를 구해서 가장 많이 담을 수 있는 물의 양을 구한다
4+
이때 두 수중 작은 수를 기준으로 작은수 * 배열간의 거리 = 물의 양 으로 계산된다.
5+
6+
2. 예외케이스
7+
8+
3. 알고리즘
9+
투포인터
10+
11+
4. 구현
12+
두개의 포인터를 양쪽에 두고 최대값을 구하는 것이므로 두개의 포인터중 작은 값을 가지는 포인터를 반대방향으로 이동시킨다.
13+
왜냐하면 큰 값을 가지는 포인터를 이동시켜버리면 그 다음 물의 양은 이전보다 클 수 없기 때문이다.
14+
15+
*/
16+
17+
import java.util.*;
18+
19+
class Solution {
20+
public int maxArea(int[] height) {
21+
int maxArea = 0;
22+
int s = 0;
23+
int e = height.length - 1;
24+
25+
while (s < e) {
26+
// 물의 양
27+
int area = (e - s) * Math.min(height[s], height[e]);
28+
maxArea = Math.max(area, maxArea);
29+
// 포인터 이동
30+
if (height[s] > height[e]) {
31+
e -= 1;
32+
} else {
33+
s += 1;
34+
}
35+
}
36+
37+
return maxArea;
38+
}
39+
}

group-anagrams/rivkode.java

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
1. 문제 이해
3+
strs로 들어오는 인풋들에 대해 동일한 문자를 사용해서 대체할 수 있는지 체크
4+
대체할 수 있으면 하나의 그룹으로 묶어서 List 생성
5+
생성한 그룹들을 모아서 다시 하나의 2차원 리스트로 반환
6+
7+
2. 알고리즘
8+
2중 for loop인데 조건을 보니까
9+
탐색을 10^4 * 100 이면 10^6 이므로 1,000,000 이니까
10+
해볼만 한 것 같다.
11+
12+
3. 구현
13+
각 글자들을 정렬해서 기존과 같은 인덱스를 가지는 hashmap 생성
14+
15+
글자가 같은지 비교
16+
같은 글자의 인덱스를 체크해서 기존 리스트에서 해당 글자를 넣음
17+
없으면 본인만 넣음
18+
19+
반환
20+
21+
아니다 ..
22+
답지 참고하니 단순히 HashMap의 key value를 인덱스, 정렬된 단어가 아니라
23+
HashMap에서 key 로는 sorted 된 단어를 넣고 value 로는 List를 만들어서 일치하는 단어 리스트를 넣고 있네.
24+
25+
이렇게 되면 한번만 for loop 를 도는것이므로 리스트에서 제거하거나 하는 일이 없어도 된다.
26+
그리고 구현도 깔끔하게 그리고 이해하기 쉽게 구현된다.
27+
28+
4. 예외
29+
없을 경우 본인 넣기
30+
글자는 소문자만 존재
31+
32+
*/
33+
34+
import java.util.*;
35+
36+
class Solution {
37+
public List<List<String>> groupAnagrams(String[] strs) {
38+
Map<String, List<String>> anagrams = new HashMap<>();
39+
40+
for (int i=0; i<strs.length; i++) {
41+
String w = strs[i];
42+
43+
char[] arr = w.toCharArray();
44+
Arrays.sort(arr);
45+
String sorted = new String(arr);
46+
47+
if (!anagrams.containsKey(sorted)) {
48+
anagrams.put(sorted, new LinkedList<>());
49+
}
50+
List<String> list = anagrams.get(sorted);
51+
list.add(w);
52+
}
53+
54+
return new ArrayList<>(anagrams.values());
55+
56+
// List<String> originLst = new ArrayList<>();
57+
// Map<Integer, String> hash = new HashMap<>();
58+
// List<List<String>> answer = new ArrayList<>();
59+
60+
// for (int i=0; i<strs.length; i++) {
61+
// String s = strs[i];
62+
// originLst.add(s);
63+
// char[] cArr = s.toCharArray();
64+
// Arrays.sort(cArr);
65+
// String orS = new String(cArr);
66+
// hash.put(i, orS);
67+
// }
68+
69+
// for (int i=0; i<orderLst.size(); i++) {
70+
// List<String> tmp = new ArrayList<>();
71+
// String s = orderLst.get(i);
72+
// // 정답에 넣기
73+
// tmp.add(originLst.get(i));
74+
// for (int j=i; j<orderLst.size(); j++) {
75+
// String compare = orderLst.get(j);
76+
// if (s.equals(compare)) {
77+
78+
// // 정답에 넣기
79+
// tmp.add(originLst.get(j));
80+
// }
81+
// }
82+
// answer.add(tmp);
83+
// }
84+
85+
// return answer;
86+
}
87+
}

0 commit comments

Comments
 (0)