Skip to content
Open
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
1 change: 0 additions & 1 deletion best-time-to-buy-and-sell-stock/robinyoon-dev.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ var maxProfit = function (prices) {
return maxProfit;
};


// -----아래는 이전에 작성한 답안입니다.
// /**
// * @param {number[]} prices
Expand Down
45 changes: 45 additions & 0 deletions group-anagrams/robinyoon-dev.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/**
* @param {string[]} strs
* @return {string[][]}
*/

// 문제는 풀었으나 시간 복잡도 측면에서 효율이 너무 떨어지는 풀이 방법....
var groupAnagrams = function (strs) {
let outputArr = [];
let countArr = [];

const A_ASCII = 'a'.charCodeAt(0);
const Z_ASCII = 'z'.charCodeAt(0);

let charCounts = Z_ASCII - A_ASCII + 1;
let charCountArr = new Array(charCounts).fill(0); //인덱스가 알파벳을 나타냄.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

각 문자열을 알파벳 카운트 배열로 바꿔서 비교하는 방식 자체가 정석적인 anagram 풀이 아이디어라서, 접근을 잘 잡으신 것 같아요!


for (str of strs) {
let strCountString = getStrCountString(str);

let hasSameCountIndex = countArr.findIndex((item) => item === strCountString);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

findIndex로 매번 선형 탐색을 해서, 입력 문자열 수가 커지면 시간 복잡도가 많이 커질 것 같아요.
countArr 대신 ‎Map<string, string[]>처럼 ‎strCountString을 key로 바로 그룹 배열을 찾아갈 수 있게 두면, 여기 조회는 평균 O(1)에 처리돼서 전체 성능이 더 좋아질 것 같습니다!


if (hasSameCountIndex !== -1) {
outputArr[hasSameCountIndex].push(str);
} else {
countArr.push(strCountString);

outputArr.push([str]);
}
}

return outputArr;

function getStrCountString(str) {
let tempArr = [...charCountArr];

for (char of str) {
let charAscii = char.charCodeAt(0);
let charIndex = charAscii - A_ASCII;
tempArr[charIndex] += 1;
}
return tempArr.join(',');
}
};


68 changes: 68 additions & 0 deletions implement-trie-prefix-tree/robinyoon-dev.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// 문제풀이 해설 보고 푼 문제입니다.

var TrieNode = function () {
this.children = {};
this.isEnd = false;
}

var Trie = function () {
this.root = new TrieNode();
};

/**
* @param {string} word
* @return {void}
*/
Trie.prototype.insert = function (word) {
let currentNode = this.root;
for (let i = 0; i < word.length; i++) {
let char = word[i];
if (!currentNode.children[char]) {
currentNode.children[char] = new TrieNode();

}
currentNode = currentNode.children[char];
}

currentNode.isEnd = true;
};

/**
* @param {string} word
* @return {boolean}
*/
Trie.prototype.search = function (word) {
let currentNode = this.root;
for (let i = 0; i < word.length; i++) {
let char = word[i];
if (!currentNode.children[char]) {
return false;
}
currentNode = currentNode.children[char];
}
return currentNode.isEnd;
};

/**
* @param {string} prefix
* @return {boolean}
*/
Trie.prototype.startsWith = function (prefix) {
let currentNode = this.root;
for (let i = 0; i < prefix.length; i++) {
let char = prefix[i];
if (!currentNode.children[char]) {
return false;
}
currentNode = currentNode.children[char];
}
return true;
};

/**
* Your Trie object will be instantiated and called as such:
* var obj = new Trie()
* obj.insert(word)
* var param_2 = obj.search(word)
* var param_3 = obj.startsWith(prefix)
*/
27 changes: 27 additions & 0 deletions word-break/robinyoon-dev.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// 문풀 해설 보고 푼 문제
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boolean}
*/
var wordBreak = function (s, wordDict) {

const dp = new Array(s.length + 1).fill(false);
dp[0] = true;

let maxLength = 0;
for (let word of wordDict) {
maxLength = Math.max(maxLength, word.length);
}

for (let i = 1; i <= s.length; i++) {
for (let j = Math.max(0, i - maxLength); j < i; j++) {
if (dp[j] && wordDict.includes(s.substring(j, i))) {
dp[i] = true;
break;
}
}
}

return dp[s.length];
};
Loading