Skip to content

Commit 1d57393

Browse files
committed
Word Break
1 parent 1a8ba73 commit 1d57393

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

โ€Žword-break/lledellebell.jsโ€Ž

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/**
2+
* @problem
3+
* ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด s๊ฐ€ ๋‹จ์–ด ์‚ฌ์ „ wordDict์— ํฌํ•จ๋œ ๋‹จ์–ด๋“ค๋กœ๋งŒ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
4+
* ๋‹จ์–ด ์‚ฌ์ „์˜ ๋‹จ์–ด๋“ค์€ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฌธ์ž์—ด s๋ฅผ ์™„์ „ํžˆ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
5+
*
6+
* @constraints
7+
* - 1 <= s.length <= 300
8+
* - 1 <= wordDict.length <= 1000
9+
* - 1 <= wordDict[i].length <= 20
10+
* - s์™€ wordDict[i]๋Š” ๋ชจ๋‘ ์†Œ๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์œผ๋กœ๋งŒ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
11+
*
12+
* @param {string} s - ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด
13+
* @param {string[]} wordDict - ๋‹จ์–ด ์‚ฌ์ „
14+
* @returns {boolean} ๋ฌธ์ž์—ด s๊ฐ€ ๋‹จ์–ด ์‚ฌ์ „์˜ ๋‹จ์–ด๋“ค๋กœ๋งŒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
15+
*
16+
* @example
17+
* - ์˜ˆ์ œ 1:
18+
* ใ„ด Input: s = "leetcode", wordDict = ["leet", "code"]
19+
* ใ„ด Output: true
20+
* ใ„ด Explanation: "leetcode"๋Š” "leet" + "code"๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
21+
* - ์˜ˆ์ œ 2:
22+
* ใ„ด Input: s = "applepenapple", wordDict = ["apple", "pen"]
23+
* ใ„ด Output: true
24+
* ใ„ด Explanation: "applepenapple"๋Š” "apple" + "pen" + "apple"๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
25+
* - ์˜ˆ์ œ 3:
26+
* ใ„ด Input: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
27+
* ใ„ด Output: false
28+
* ใ„ด Explanation: "catsandog"๋Š” wordDict์˜ ๋‹จ์–ด๋“ค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
29+
*
30+
* @description
31+
* - ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n^2)
32+
* ใ„ด ์™ธ๋ถ€ ๋ฐ˜๋ณต๋ฌธ: ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด n์— ๋Œ€ํ•ด 1๋ถ€ํ„ฐ n๊นŒ์ง€ ๋ฐ˜๋ณต (O(n))
33+
* ใ„ด ๋‚ด๋ถ€ ๋ฐ˜๋ณต๋ฌธ: ๊ฐ i์— ๋Œ€ํ•ด ์ตœ๋Œ€ i๋ฒˆ ๋ฐ˜๋ณต (O(n))
34+
* ใ„ด substring ๋ฐ Set ๊ฒ€์ƒ‰: O(1) (substring์€ ๋‚ด๋ถ€์ ์œผ๋กœ O(k)์ด์ง€๋งŒ, k๋Š” ์ตœ๋Œ€ ๋‹จ์–ด ๊ธธ์ด๋กœ ๊ฐ„์ฃผ)
35+
* ใ„ด ๊ฒฐ๊ณผ์ ์œผ๋กœ O(n^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง
36+
* - ๊ณต๊ฐ„ ๋ณต์žก๋„: O(n + m)
37+
* ใ„ด dp ๋ฐฐ์—ด์˜ ํฌ๊ธฐ: s์˜ ๊ธธ์ด n + 1 (O(n))
38+
* ใ„ด wordSet: wordDict์˜ ๋‹จ์–ด ๊ฐœ์ˆ˜์— ๋น„๋ก€ (O(m), m์€ wordDict์˜ ๋‹จ์–ด ์ˆ˜)
39+
*/
40+
function wordBreak(s, wordDict) {
41+
// wordDict๋ฅผ Set์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ O(1)๋กœ ๋งŒ๋“ฆ
42+
const wordSet = new Set(wordDict);
43+
44+
// dp ๋ฐฐ์—ด ์ƒ์„ฑ: dp[i]๋Š” s์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ i๋ฒˆ์งธ ๋ฌธ์ž๊นŒ์ง€๊ฐ€ wordDict์˜ ๋‹จ์–ด๋“ค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ„
45+
const dp = new Array(s.length + 1).fill(false);
46+
dp[0] = true; // ๋นˆ ๋ฌธ์ž์—ด์€ ํ•ญ์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ
47+
48+
// i๋Š” ๋ฌธ์ž์—ด์˜ ๋ ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ„
49+
for (let i = 1; i <= s.length; i++) {
50+
// j๋Š” ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ„
51+
for (let j = 0; j < i; j++) {
52+
// dp[j]๊ฐ€ true์ด๊ณ , s[j:i]๊ฐ€ wordSet์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด
53+
if (dp[j] && wordSet.has(s.substring(j, i))) {
54+
dp[i] = true; // dp[i]๋ฅผ true๋กœ ์„ค์ •
55+
break; // ๋” ์ด์ƒ ํ™•์ธํ•  ํ•„์š” ์—†์Œ
56+
}
57+
}
58+
}
59+
60+
// dp[s.length]๊ฐ€ true๋ผ๋ฉด ๋ฌธ์ž์—ด s๋ฅผ wordDict์˜ ๋‹จ์–ด๋“ค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ
61+
return dp[s.length];
62+
}
63+
64+
const s1 = "leetcode";
65+
const wordDict1 = ["leet", "code"];
66+
console.log(wordBreak(s1, wordDict1)); // true
67+
68+
const s2 = "applepenapple";
69+
const wordDict2 = ["apple", "pen"];
70+
console.log(wordBreak(s2, wordDict2)); // true
71+
72+
const s3 = "catsandog";
73+
const wordDict3 = ["cats", "dog", "sand", "and", "cat"];
74+
console.log(wordBreak(s3, wordDict3)); // false

0 commit comments

Comments
ย (0)