Skip to content

Commit 94bfcdb

Browse files
authored
Merge pull request #408 from wogha95/main
[์žฌํ˜ธ] WEEK 04 Solutions
2 parents 0e31704 + 0975c1c commit 94bfcdb

File tree

5 files changed

+373
-0
lines changed

5 files changed

+373
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* TC: O(N)
3+
* SC: O(N)
4+
* nums์˜ ์ˆซ์ž์— ์ ‘๊ทผํ•˜๋Š” ํšŸ์ˆ˜๋Š” 2๋ฒˆ์—์„œ N๋งŒํผ, 4๋ฒˆ์—์„œ ์ตœ๋Œ€ N๋งŒํผ ์ž…๋‹ˆ๋‹ค.
5+
* ์ฆ‰, 2N๋ฒˆ ๋งŒํผ nums์˜ ์ˆซ์ž์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.
6+
* N^2์ด ์•„๋‹Œ ์ด์œ : N^2์ด ์•„๋‹Œ 2N์œผ๋กœ ์ƒ๊ฐํ•œ ์ด์œ ๋Š” 2๋ฒˆ์—์„œ N๋ฒˆ์˜ ์ˆœํšŒ๋ฅผ ํ•˜์ง€๋งŒ ๊ฐ ์ˆœํšŒ๊ฐ€ ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ ์ˆœํšŒ๋Š” 2N์œผ๋กœ ๊ณ„์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค. (1๋ฒˆ์˜ N ์ˆœํšŒ ์ œ์™ธ)
7+
* @see https://github.com/DaleStudy/leetcode-study/pull/408#discussion_r1747071917
8+
*/
9+
10+
/**
11+
* @param {number[]} nums
12+
* @return {number}
13+
*/
14+
var longestConsecutive = function (nums) {
15+
let maxCount = 0;
16+
const obj = {};
17+
18+
// 1. ์ˆซ์ž์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ‚ค๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์ €์žฅ
19+
for (const num of nums) {
20+
obj[num] = true;
21+
}
22+
23+
// 2. ์‹œ์ž‘์ ๋“ค์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ˆœํšŒ
24+
for (const num of nums) {
25+
// 3. ์—ฐ์†์ ์ธ ๋ฐฐ์—ด์˜ ์‹œ์ž‘์ ์ธ์ง€ ํ™•์ธ
26+
if (obj[num - 1]) {
27+
continue;
28+
}
29+
30+
// 4. ์—ฐ์†์ ์ธ ๋ฐฐ์—ด์˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ๋์ ๊นŒ์ง€ ์ˆœํšŒ
31+
let count = 1;
32+
let next = num + 1;
33+
while (obj[next]) {
34+
count += 1;
35+
next += 1;
36+
}
37+
38+
// 5. ๊ฐ€์žฅ ๊ธด ๋ฐฐ์—ด์˜ ๊ธธ์ด ๊ฐฑ์‹ 
39+
maxCount = Math.max(maxCount, count);
40+
}
41+
42+
return maxCount;
43+
};
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// TC: O(N)
2+
// SC: O(1)
3+
4+
/**
5+
* @param {number[]} nums
6+
* @return {number}
7+
*/
8+
var maxProduct = function (nums) {
9+
let maximumProduct = Number.MIN_SAFE_INTEGER;
10+
let subProduct = 1;
11+
// 1. ์ขŒ์—์„œ ์šฐ๋กœ ๋ˆ„์ ๊ณฑ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ˆœํšŒ
12+
for (let index = 0; index < nums.length; index++) {
13+
// 2. 0์„ ๋งŒ๋‚˜๋ฉด ๋ˆ„์ ๊ณฑ์— ๊ณฑํ•˜์ง€ ์•Š๊ณ  1๋กœ ์ดˆ๊ธฐํ™”
14+
if (nums[index] === 0) {
15+
maximumProduct = Math.max(maximumProduct, 0);
16+
subProduct = 1;
17+
continue;
18+
}
19+
// 3. ๋งค๋ฒˆ ๋ˆ„์ ๊ณฑ์„ ๊ฐฑ์‹ 
20+
subProduct *= nums[index];
21+
maximumProduct = Math.max(maximumProduct, subProduct);
22+
}
23+
24+
subProduct = 1;
25+
// 4. ์šฐ์—์„œ ์ขŒ๋กœ ๋ˆ„์ ๊ณฑ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ˆœํšŒ
26+
for (let index = nums.length - 1; index >= 0; index--) {
27+
// 5. 0์„ ๋งŒ๋‚˜๋ฉด ๋ˆ„์ ๊ณฑ์— ๊ณฑํ•˜์ง€ ์•Š๊ณ  1๋กœ ์ดˆ๊ธฐํ™”
28+
if (nums[index] === 0) {
29+
maximumProduct = Math.max(maximumProduct, 0);
30+
subProduct = 1;
31+
continue;
32+
}
33+
// 6. ๋งค๋ฒˆ ๋ˆ„์ ๊ณฑ์„ ๊ฐฑ์‹ 
34+
subProduct *= nums[index];
35+
maximumProduct = Math.max(maximumProduct, subProduct);
36+
}
37+
38+
return maximumProduct;
39+
};

โ€Žmissing-number/wogha95.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// TC: O(N)
2+
// SC: O(1)
3+
4+
/**
5+
* @param {number[]} nums
6+
* @return {number}
7+
*/
8+
var missingNumber = function (nums) {
9+
// result: subN - num์˜ ๋ˆ„์ ํ•ฉ์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
10+
let result = 0;
11+
// subN: 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋Š” ๋ณ€์ˆ˜
12+
let subN = 1;
13+
14+
for (const num of nums) {
15+
result += subN - num;
16+
subN += 1;
17+
}
18+
19+
// ์ตœ์ข… ๋ˆ„์ ํ•ฉ์€ (1~N๊นŒ์ง€ ํ•ฉ) - (nums์˜ ๋ชจ๋“  ์›์†Œ ํ•ฉ) ์ด๋ฏ€๋กœ ๋ˆ„๋ฝ๋œ ์ˆซ์ž๋งŒ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
20+
return result;
21+
};

โ€Žvalid-palindrome/wogha95.js

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
// 3์ฐจ
2+
// TC: O(N)
3+
// SC: O(1)
4+
// N: s.length
5+
6+
/**
7+
* @param {string} s
8+
* @return {boolean}
9+
*/
10+
var isPalindrome = function (s) {
11+
// 1. ํˆฌํฌ์ธํ„ฐ๋ฅผ ์–‘๋์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
12+
let left = 0;
13+
let right = s.length - 1;
14+
15+
while (left < right) {
16+
// 2. ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌธ์ž๊ฐ€ ์˜๋Œ€์†Œ๋ฌธ์ž, ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
17+
while (left < right && !isValid(s[left])) {
18+
left += 1;
19+
}
20+
while (left < right && !isValid(s[right])) {
21+
right -= 1;
22+
}
23+
24+
// 3. ๋ฌธ์ž์˜ ๊ฐฏ์ˆ˜๊ฐ€ ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ ํˆฌ ํฌ์ธํ„ฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€์šด๋ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ์ˆœํšŒ๋ฅผ ๋๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
25+
if (left === right) {
26+
break;
27+
}
28+
29+
// 4. ํˆฌ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์ •๋‹ต(false)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
30+
if (!isSame(s[left], s[right])) {
31+
return false;
32+
}
33+
34+
// 5. ๋‹ค์Œ ๋ฌธ์ž๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.
35+
left += 1;
36+
right -= 1;
37+
}
38+
39+
// 6. ๋ชจ๋“  ์ˆœํšŒ๊ฐ€ ๋๋ƒˆ๋‹ค๋ฉด palindrome์ด๋ผ๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
40+
return true;
41+
42+
function isValid(spell) {
43+
if ("0" <= spell && spell <= "9") {
44+
return true;
45+
}
46+
if ("a" <= spell && spell <= "z") {
47+
return true;
48+
}
49+
if ("A" <= spell && spell <= "Z") {
50+
return true;
51+
}
52+
53+
return false;
54+
}
55+
56+
function isSame(spellA, spellB) {
57+
if (spellA === spellB) {
58+
return true;
59+
}
60+
if (Math.abs(s[left].charCodeAt() - s[right].charCodeAt()) === 32) {
61+
return true;
62+
}
63+
64+
return false;
65+
}
66+
};
67+
68+
// 2์ฐจ
69+
// TC: O(N)
70+
// SC: O(N)
71+
// N: s.length
72+
73+
/**
74+
* @param {string} s
75+
* @return {boolean}
76+
*/
77+
var isPalindrome = function (s) {
78+
const phrase = s.toLowerCase();
79+
// 1. ํˆฌํฌ์ธํ„ฐ๋ฅผ ์–‘๋์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
80+
let left = 0;
81+
let right = phrase.length - 1;
82+
83+
while (left < right) {
84+
// 2. ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌธ์ž๊ฐ€ ์˜์†Œ๋ฌธ์ž, ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.
85+
while (left < right && !isValid(phrase[left])) {
86+
left += 1;
87+
}
88+
while (left < right && !isValid(phrase[right])) {
89+
right -= 1;
90+
}
91+
92+
// 3. ๋ฌธ์ž์˜ ๊ฐฏ์ˆ˜๊ฐ€ ํ™€์ˆ˜์ธ ๊ฒฝ์šฐ ํˆฌ ํฌ์ธํ„ฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€์šด๋ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ์ˆœํšŒ๋ฅผ ๋๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
93+
if (left === right) {
94+
break;
95+
}
96+
97+
// 4. ํˆฌ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ ์ •๋‹ต(false)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
98+
if (phrase[left] !== phrase[right]) {
99+
return false;
100+
}
101+
102+
// 5. ๋‹ค์Œ ๋ฌธ์ž๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.
103+
left += 1;
104+
right -= 1;
105+
}
106+
107+
// 6. ๋ชจ๋“  ์ˆœํšŒ๊ฐ€ ๋๋ƒˆ๋‹ค๋ฉด palindrome์ด๋ผ๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
108+
return true;
109+
110+
function isValid(spell) {
111+
if ("0" <= spell && spell <= "9") {
112+
return true;
113+
}
114+
if ("a" <= spell && spell <= "z") {
115+
return true;
116+
}
117+
118+
return false;
119+
}
120+
};
121+
122+
// 1์ฐจ
123+
// TC: O(N)
124+
// SC: O(N)
125+
// N: s.length
126+
127+
/**
128+
* @param {string} s
129+
* @return {boolean}
130+
*/
131+
var isPalindrome = function (s) {
132+
// 1. ๋ฌธ์ž์—ด์„ ๋ชจ๋‘ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊พธ๊ณ  ์˜์†Œ๋ฌธ์ž, ์ˆซ์ž๋งŒ ๋‚จ๊ธฐ๊ณ  ๋ชจ๋‘ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
133+
const phrase = s
134+
.toLowerCase()
135+
.split("")
136+
.filter(
137+
(spell) =>
138+
("0" <= spell && spell <= "9") || ("a" <= spell && spell <= "z")
139+
);
140+
141+
// 2. ์–‘๋์˜ ๋ฌธ์ž๋ฅผ ํ™•์ธํ•ด์„œ palindrome์ธ์ง€ ํŒ๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
142+
for (let index = 0; index < Math.floor(phrase.length / 2); index++) {
143+
if (phrase[index] !== phrase[phrase.length - index - 1]) {
144+
return false;
145+
}
146+
}
147+
148+
return true;
149+
};

โ€Žword-search/wogha95.js

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// 2์ฐจ
2+
// result flag ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉ => boolean ๋ฐ˜ํ™˜์œผ๋กœ ๊ฐœ์„ 
3+
// TC: O(M * N * 4^W)
4+
// SC: O(MIN)
5+
// W: word.length, MIN: min(M * N, W)
6+
7+
/**
8+
* @param {character[][]} board
9+
* @param {string} word
10+
* @return {boolean}
11+
*/
12+
var exist = function (board, word) {
13+
for (let r = 0; r < board.length; r++) {
14+
for (let c = 0; c < board[0].length; c++) {
15+
if (dfs(r, c, 0)) {
16+
return true;
17+
}
18+
}
19+
}
20+
21+
return false;
22+
23+
function dfs(row, column, wordIndex) {
24+
if (!isValid(row, column)) {
25+
return false;
26+
}
27+
if (board[row][column] !== word[wordIndex]) {
28+
return false;
29+
}
30+
if (wordIndex === word.length - 1) {
31+
return true;
32+
}
33+
34+
const temp = board[row][column];
35+
board[row][column] = "#";
36+
37+
if (
38+
dfs(row + 1, column, wordIndex + 1) ||
39+
dfs(row - 1, column, wordIndex + 1) ||
40+
dfs(row, column + 1, wordIndex + 1) ||
41+
dfs(row, column - 1, wordIndex + 1)
42+
) {
43+
return true;
44+
}
45+
46+
board[row][column] = temp;
47+
48+
return false;
49+
}
50+
51+
function isValid(row, column) {
52+
if (row < 0 || board.length <= row) {
53+
return false;
54+
}
55+
if (column < 0 || board[0].length <= column) {
56+
return false;
57+
}
58+
return true;
59+
}
60+
};
61+
62+
// 1์ฐจ
63+
// TC: O(M * N * 4^W)
64+
// SC: O(MIN)
65+
// W: word.length, MIN: min(M * N, W)
66+
67+
/**
68+
* @param {character[][]} board
69+
* @param {string} word
70+
* @return {boolean}
71+
*/
72+
var exist = function (board, word) {
73+
let result = false;
74+
75+
// 1. 2์ฐจ์› ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ์ˆœํšŒ
76+
for (let r = 0; r < board.length; r++) {
77+
for (let c = 0; c < board[0].length; c++) {
78+
dfs(r, c, 0);
79+
}
80+
}
81+
82+
return result;
83+
84+
function dfs(row, column, wordIndex) {
85+
// 2. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์ขŒํ‘œ์ธ์ง€ ๊ฒ€์ฆ
86+
if (!isValid(row, column)) {
87+
return;
88+
}
89+
// 3. word์—์„œ ์ฐพ๊ณ  ์žˆ๋Š” ๋ฌธ์ž์ธ์ง€ ํ™•์ธ
90+
if (board[row][column] !== word[wordIndex]) {
91+
return;
92+
}
93+
// 4. word ๋ฌธ์ž๋ฅผ ๋‹ค ์ฐพ์•˜๋Š”์ง€ ํ™•์ธ
94+
if (wordIndex === word.length - 1) {
95+
result = true;
96+
return;
97+
}
98+
99+
// 5. ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•ด๋‘ 
100+
const temp = board[row][column];
101+
board[row][column] = "#";
102+
// 6. ์ƒํ•˜์ขŒ์šฐ๋กœ ์ขŒํ‘œ ๋ฐฉ๋ฌธ
103+
dfs(row + 1, column, wordIndex + 1);
104+
dfs(row - 1, column, wordIndex + 1);
105+
dfs(row, column + 1, wordIndex + 1);
106+
dfs(row, column - 1, wordIndex + 1);
107+
// 7. ํ•ด๋‹น ์ขŒํ‘œ์˜ ์žฌ๊ท€ ๋ฐฉ๋ฌธ์ด ๋๋‚˜๋ฉด ๋ฏธ๋ฐฉ๋ฌธ์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์›๋ž˜ ๋ฌธ์ž๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ
108+
board[row][column] = temp;
109+
}
110+
111+
// ์œ ํšจํ•œ ์ขŒํ‘œ์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
112+
function isValid(row, column) {
113+
if (row < 0 || board.length <= row) {
114+
return false;
115+
}
116+
if (column < 0 || board[0].length <= column) {
117+
return false;
118+
}
119+
return true;
120+
}
121+
};

0 commit comments

Comments
ย (0)