Skip to content

Commit 4d7aff8

Browse files
authored
Merge pull request #2170 from leehyeyun/main
[leehyeyun] WEEK 05 solutions
2 parents 30e2a70 + 6235a07 commit 4d7aff8

File tree

3 files changed

+241
-0
lines changed

3 files changed

+241
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/**
2+
* @param {number[]} prices
3+
* @return {number}
4+
*/
5+
/*
6+
주어진 배열 prices에서 prices[i]는 i번째 날의 주가를 의미한다.
7+
8+
한 번의 거래(1회 매수 + 1회 매도)만 할 수 있으며,
9+
미래의 어떤 날에 매도해야 한다. (즉, 매수일 < 매도일)
10+
11+
목표:
12+
- 매수 후 매도하여 만들 수 있는 최대 이익을 계산한다.
13+
- 이익을 낼 수 없다면 0을 반환한다.
14+
15+
입력 형식 :
16+
- prices: 정수 배열
17+
- 1 <= prices.length <= 100,000
18+
- 0 <= prices[i] <= 10,000
19+
20+
출력 형식 :
21+
- 만들 수 있는 최대 이익 (정수)
22+
23+
예시 :
24+
25+
Example 1
26+
입력 : prices = [7,1,5,3,6,4]
27+
출력 : 5
28+
설명 :
29+
- 2번째 날(가격 1)에 매수
30+
- 5번째 날(가격 6)에 매도
31+
- 이익 = 6 - 1 = 5
32+
33+
※ 매수일보다 앞선 날짜에 매도하는 것은 불가능함.
34+
35+
Example 2
36+
입력 : prices = [7,6,4,3,1]
37+
출력 : 0
38+
설명 :
39+
- 어떤 날을 매수해도 이후 가격이 상승하지 않음
40+
- 이익을 낼 수 없으므로 0 반환
41+
*/
42+
var maxProfit = function(prices) {
43+
44+
let min_value = prices[0];
45+
let min_value_index = 0;
46+
let max_value = 0;
47+
48+
for (let i = 0; i < prices.length; i ++) {
49+
if(prices[i] < min_value)
50+
{
51+
min_value = prices[i];
52+
min_value_index = i;
53+
}
54+
}
55+
56+
if(min_value_index == (prices.length - 1))
57+
{
58+
return 0;
59+
}
60+
61+
for (min_value_index; min_value_index < prices.length; min_value_index++)
62+
{
63+
64+
if (max_value < prices[min_value_index]) {
65+
max_value = prices[min_value_index];
66+
}
67+
}
68+
69+
return max_value - min_value;
70+
};
71+
72+
console.log(maxProfit([7,1,5,3,6,4]))
73+
console.log(maxProfit([7,6,4,3,1]))
74+
75+
76+
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
var encode = function (strs) {
2+
// strs: string[]
3+
// return: string
4+
// write your code here
5+
6+
let encode_result = "";
7+
8+
for (const encode_strs of strs)
9+
{
10+
const encode_strs_length = encode_strs.length;
11+
12+
if(encode_result != undefined)
13+
{
14+
encode_result = encode_result + encode_strs_length + "|" + encode_strs;
15+
}
16+
17+
}
18+
19+
return encode_result;
20+
};
21+
22+
var decode = function (str) {
23+
// str: string
24+
// return: string[]
25+
// write your code here
26+
27+
let results = [];
28+
29+
while (str.length > 0) {
30+
let i = 0;
31+
while (str[i] >= '0' && str[i] <= '9') {
32+
i++;
33+
}
34+
35+
let decode_str_length = str.substring(0, i);
36+
let len = parseInt(decode_str_length, 10);
37+
38+
let newStr = str.substring(i + 1);
39+
let result = newStr.substr(0,decode_str_length)
40+
41+
str = newStr.substring(len);
42+
43+
results.push(result);
44+
}
45+
46+
return results;
47+
};
48+
49+
console.log(decode(encode(["lint","code","love","you"])));
50+
console.log(decode(encode(["we","say",":","yes"])));
51+

group-anagrams/leehyeyun.js

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/**
2+
* @param {string[]} strs
3+
* @return {string[][]}
4+
*/
5+
/*
6+
주어진 문자열 배열 strs에서,
7+
서로 아나그램(anagram) 관계인 문자열들을 묶어 그룹으로 반환하는 문제이다.
8+
9+
아나그램이란?
10+
- 문자열의 문자들을 재배열하여 서로 같은 구성을 만들 수 있는 문자열을 의미한다.
11+
- 예: "eat", "tea", "ate"는 같은 아나그램 그룹에 속함.
12+
13+
목표:
14+
- strs 내 모든 문자열을 아나그램끼리 묶은 그룹들의 배열로 반환한다.
15+
- 그룹의 순서나, 그룹 내부 문자열의 순서는 중요하지 않다.
16+
17+
입력 형식 :
18+
- strs: 문자열 배열
19+
- 1 <= strs.length <= 10,000
20+
- 0 <= strs[i].length <= 100
21+
- strs[i]는 모두 소문자 영어 알파벳으로 구성됨
22+
23+
출력 형식 :
24+
- 아나그램끼리 묶인 그룹들의 배열 (2차원 배열)
25+
26+
예시 :
27+
28+
Example 1
29+
입력 : ["eat","tea","tan","ate","nat","bat"]
30+
출력 : [["bat"], ["nat","tan"], ["ate","eat","tea"]]
31+
설명 :
32+
- "eat", "tea", "ate"는 문자 구성이 동일하므로 같은 그룹
33+
- "tan", "nat"도 서로 아나그램이므로 같은 그룹
34+
- "bat"는 다른 어떤 문자열로도 아나그램을 만들 수 없으므로 단독 그룹
35+
36+
Example 2
37+
입력 : [""]
38+
출력 : [[""]]
39+
설명 :
40+
- 빈 문자열도 하나의 문자열로 취급되며, 자신과 함께 단일 그룹 생성
41+
42+
Example 3
43+
입력 : ["a"]
44+
출력 : [["a"]]
45+
설명 :
46+
- 단일 문자 하나만 있으므로 그대로 그룹화됨
47+
*/
48+
var groupAnagrams = function (strs) {
49+
50+
const processed = new Set();
51+
const result = [];
52+
53+
for (let i = 0; i < strs.length; i++) {
54+
55+
const base_word = strs[i];
56+
if (processed.has(base_word)) continue;
57+
58+
const baseMap = new Map();
59+
60+
for (const base_word_char of base_word) {
61+
if (baseMap.has(base_word_char)) {
62+
let base_word_char_count = baseMap.get(base_word_char);
63+
64+
base_word_char_count++;
65+
baseMap.set(base_word_char, base_word_char_count)
66+
} else {
67+
baseMap.set(base_word_char, 1)
68+
}
69+
}
70+
71+
const group = [base_word];
72+
processed.add(base_word);
73+
74+
for (let j = i + 1; j < strs.length; j++) {
75+
76+
const candidate_word = strs[j];
77+
78+
if (processed.has(candidate_word)) continue;
79+
80+
const compareMap = new Map([...baseMap]);
81+
82+
for (const candidate_word_char of candidate_word) {
83+
if (compareMap.has(candidate_word_char)) {
84+
85+
let candidate_word_char_count = compareMap.get(candidate_word_char)
86+
candidate_word_char_count--;
87+
88+
if (candidate_word_char_count === 0) {
89+
compareMap.delete(candidate_word_char)
90+
} else if (candidate_word_char_count > 0) {
91+
compareMap.set(candidate_word_char, candidate_word_char_count)
92+
}
93+
}
94+
}
95+
96+
//최종 리턴
97+
if (compareMap.size == 0) {
98+
processed.add(candidate_word);
99+
group.push(candidate_word);
100+
}
101+
}
102+
103+
result.push(group);
104+
105+
}
106+
107+
return result;
108+
};
109+
110+
console.log(groupAnagrams(["eat", "tea", "tan", "ate", "nat", "bat"]))
111+
console.log(groupAnagrams([""]))
112+
console.log(groupAnagrams(["a"]))
113+
114+

0 commit comments

Comments
 (0)