Skip to content

Commit 8fa9a72

Browse files
authored
Merge pull request #1526 from clara-shin/main
[clara-shin] WEEK09 Solutions
2 parents 972ef03 + 4e1a262 commit 8fa9a72

File tree

5 files changed

+282
-0
lines changed

5 files changed

+282
-0
lines changed

โ€Žlinked-list-cycle/clara-shin.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// ์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฌธ์ œ
2+
// ์‚ฌ์ดํด: ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ์–ด๋–ค ๋…ธ๋“œ๊ฐ€, ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋˜ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ
3+
4+
// ๋ฌธ์ œ์ ‘๊ทผ:
5+
// 1) hashset : ์ง๊ด€์ 
6+
// 2) two pointers : ํ”Œ๋กœ์ด๋“œ์˜ ์‚ฌ์ดํด ํƒ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜(ํ† ๋ผ์™€ ๊ฑฐ๋ถ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜)
7+
8+
/**
9+
* Definition for singly-linked list.
10+
* function ListNode(val) {
11+
* this.val = val;
12+
* this.next = null;
13+
* }
14+
*/
15+
16+
/** two pointers๋กœ ์ ‘๊ทผ
17+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
18+
* ๊ณต๊ฐ„๋ณต์žก๋„: O(1) - โœ… follow-up ๊ณ ๋ ค
19+
* @param {ListNode} head
20+
* @return {boolean}
21+
*/
22+
var hasCycle = function (head) {
23+
if (!head || !head.next) return false;
24+
25+
let slow = head; // ๊ฑฐ๋ถ์ด: ํ•œ ์นธ์”ฉ
26+
let fast = head; // ํ† ๋ผ: ๋‘ ์นธ์”ฉ
27+
28+
while (fast && fast.next) {
29+
slow = slow.next; // ํ•œ ์นธ ์ด๋™
30+
fast = fast.next.next; // ๋‘ ์นธ ์ด๋™
31+
32+
// ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๋งŒ๋‚˜๋ฉด ์‚ฌ์ดํด ์กด์žฌํ•œ๋‹ค
33+
if (slow === fast) {
34+
return true;
35+
}
36+
}
37+
38+
return false;
39+
};
40+
41+
/**
42+
* hashset์œผ๋กœ ์ ‘๊ทผ
43+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
44+
* ๊ณต๊ฐ„๋ณต์žก๋„: O(n)
45+
*/
46+
var hasCycle2 = function (head) {
47+
if (!head) return false;
48+
49+
const visited = new Set();
50+
let current = head;
51+
52+
while (current) {
53+
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ผ๋ฉด ์‚ฌ์ดํด ์กด์žฌํ•œ๋‹ค
54+
if (visited.has(current)) {
55+
return true;
56+
}
57+
58+
// ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์— ์ถ”๊ฐ€
59+
visited.add(current);
60+
current = current.next;
61+
}
62+
63+
return false;
64+
};
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* ์ •์ˆ˜ ๋ฐฐ์—ด์—์„œ ์—ฐ์†๋œ ๋ถ€๋ถ„๋ฐฐ์—ด(subarray)์˜ ๊ณฑ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฐ’์„ ์ฐพ๋Š” ํ•จ์ˆ˜
3+
*
4+
* ์Œ์ˆ˜๋ผ๋ฆฌ ๊ณฑํ•˜๋ฉด ์–‘์ˆ˜๊ฐ€ ๋จ
5+
* 0์ด ๋‚˜์˜ค๋ฉด ๊ณฑ์€ 0์ด ๋จ => ๋ถ€๋ถ„๋ฐฐ์—ด์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ
6+
* ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’์„ ๋™์‹œ์— ์ถ”์ ํ•ด์•ผ ํ•จ: ์Œ์ˆ˜์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€๊ฐ’์ด ์ตœ์†Œ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ์Œ
7+
*
8+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ•: ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ
9+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(n), ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
10+
*/
11+
12+
/**
13+
* @param {number[]} nums
14+
* @return {number}
15+
*/
16+
var maxProduct = function (nums) {
17+
if (nums.length === 0) return 0;
18+
19+
// ํ˜„์žฌ ์œ„์น˜์—์„œ ๋๋‚˜๋Š” ๋ถ€๋ถ„๋ฐฐ์—ด์˜ ์ตœ๋Œ€๊ณฑ๊ณผ ์ตœ์†Œ๊ณฑ
20+
let maxHere = nums[0];
21+
let minHere = nums[0];
22+
let result = nums[0];
23+
24+
for (let i = 1; i < nums.length; i++) {
25+
const num = nums[i];
26+
27+
// ํ˜„์žฌ ์ˆซ์ž๊ฐ€ ์Œ์ˆ˜๋ผ๋ฉด max์™€ min์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ
28+
if (num < 0) {
29+
[maxHere, minHere] = [minHere, maxHere];
30+
}
31+
32+
// ํ˜„์žฌ ์ˆซ์ž๋ถ€ํ„ฐ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ๊ณฑ์— ํ˜„์žฌ ์ˆซ์ž๋ฅผ ๊ณฑํ•จ
33+
maxHere = Math.max(num, maxHere * num);
34+
minHere = Math.min(num, minHere * num);
35+
36+
// ์ „์ฒด ์ตœ๋Œ€๊ฐ’ ์—…๋ฐ์ดํŠธ
37+
result = Math.max(result, maxHere);
38+
}
39+
40+
return result;
41+
};
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* ๋ฌธ์ž์—ด s์—์„œ ๋ฌธ์ž์—ด t์˜ ๋ชจ๋“  ๋ฌธ์ž(์ค‘๋ณต ํฌํ•จ)๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ฐพ๋Š” ๋ฌธ์ œ
3+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(m + n), ๊ณต๊ฐ„๋ณต์žก๋„: O(m + n)
4+
*/
5+
6+
/**
7+
* @param {string} s
8+
* @param {string} t
9+
* @return {string}
10+
*/
11+
var minWindow = function (s, t) {
12+
if (s.length < t.length) return '';
13+
14+
// t์˜ ๊ฐ ๋ฌธ์ž๋ณ„ ํ•„์š”ํ•œ ๊ฐœ์ˆ˜๋ฅผ Map์œผ๋กœ ์ €์žฅ
15+
const need = new Map();
16+
for (let char of t) {
17+
need.set(char, (need.get(char) || 0) + 1);
18+
}
19+
20+
let left = 0;
21+
let right = 0;
22+
let valid = 0; // ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ์ž ์ข…๋ฅ˜ ์ˆ˜
23+
let minLen = Infinity;
24+
let start = 0;
25+
26+
// ํ˜„์žฌ ์œˆ๋„์šฐ์˜ ๋ฌธ์ž๋ณ„ ๊ฐœ์ˆ˜
27+
const window = new Map();
28+
29+
while (right < s.length) {
30+
// ์œˆ๋„์šฐ์— ๋ฌธ์ž ์ถ”๊ฐ€
31+
const rightChar = s[right];
32+
right++;
33+
34+
// ํ•„์š”ํ•œ ๋ฌธ์ž์ธ ๊ฒฝ์šฐ์—๋งŒ ์ฒ˜๋ฆฌ
35+
if (need.has(rightChar)) {
36+
window.set(rightChar, (window.get(rightChar) || 0) + 1);
37+
if (window.get(rightChar) === need.get(rightChar)) {
38+
valid++;
39+
}
40+
}
41+
42+
// ์œˆ๋„์šฐ ์ถ•์†Œ ์‹œ๋„
43+
while (valid === need.size) {
44+
// ๋” ์ž‘์€ ์œˆ๋„์šฐ ๋ฐœ๊ฒฌ์‹œ ์—…๋ฐ์ดํŠธ
45+
if (right - left < minLen) {
46+
start = left;
47+
minLen = right - left;
48+
}
49+
50+
// left๋ฅผ ์ด๋™์‹œํ‚ค๋ฉฐ ์œˆ๋„์šฐ์—์„œ ๋ฌธ์ž ์ œ๊ฑฐ
51+
const leftChar = s[left];
52+
left++;
53+
54+
if (need.has(leftChar)) {
55+
if (window.get(leftChar) === need.get(leftChar)) {
56+
valid--;
57+
}
58+
window.set(leftChar, window.get(leftChar) - 1);
59+
}
60+
}
61+
}
62+
63+
return minLen === Infinity ? '' : s.substring(start, start + minLen);
64+
};
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/**
2+
* ๊ทธ๋ž˜ํ”„ ์—ญ๋ฐฉํ–ฅ ํƒ์ƒ‰ : DFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒœํ‰์–‘๊ณผ ๋Œ€์„œ์–‘์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ง€์ ์„ ์ฐพ๋Š” ๋ฌธ์ œ
3+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(m ร— n) - ๊ฐ ์…€์„ ์ตœ๋Œ€ 2๋ฒˆ ๋ฐฉ๋ฌธ
4+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(m ร— n) - visited ๋ฐฐ์—ด๊ณผ ์Šคํƒ ๊ณต๊ฐ„
5+
*/
6+
/**
7+
* @param {number[][]} heights
8+
* @return {number[][]}
9+
*/
10+
var pacificAtlantic = function (heights) {
11+
if (!heights || heights.length === 0) return [];
12+
13+
const m = heights.length;
14+
const n = heights[0].length;
15+
16+
// ๋น„ํŠธ๋งˆ์Šคํ‚น ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฌธ ์ƒํƒœ ๊ด€๋ฆฌ
17+
// 0: ๋ฏธ๋ฐฉ๋ฌธ, 1: ํƒœํ‰์–‘๋งŒ, 2: ๋Œ€์„œ์–‘๋งŒ, 3: ๋‘˜ ๋‹ค
18+
const visited = Array(m)
19+
.fill()
20+
.map(() => Array(n).fill(0));
21+
const directions = [
22+
[-1, 0],
23+
[1, 0],
24+
[0, -1],
25+
[0, 1],
26+
];
27+
const result = [];
28+
29+
// DFS - ์Šคํƒ ์‚ฌ์šฉ
30+
function dfs(startPoints, oceanMask) {
31+
const stack = [...startPoints];
32+
33+
while (stack.length > 0) {
34+
const [row, col] = stack.pop();
35+
36+
// ์ด๋ฏธ ํ•ด๋‹น ๋ฐ”๋‹ค๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉด ๊ฑด๋„ˆ๋›ฐ๊ธฐ
37+
if (visited[row][col] & oceanMask) continue;
38+
39+
// ํ˜„์žฌ ๋ฐ”๋‹ค ํ‘œ์‹œ
40+
visited[row][col] |= oceanMask;
41+
42+
// ์–‘์ชฝ ๋ฐ”๋‹ค ๋ชจ๋‘ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•˜๋ฉด ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€
43+
if (visited[row][col] === 3) {
44+
result.push([row, col]);
45+
}
46+
47+
// 4๋ฐฉํ–ฅ ํƒ์ƒ‰
48+
for (const [dr, dc] of directions) {
49+
const newRow = row + dr;
50+
const newCol = col + dc;
51+
52+
// ๊ฒฝ๊ณ„ ํ™•์ธ ๋ฐ ๋†’์ด ์กฐ๊ฑด ํ™•์ธ
53+
if (
54+
newRow >= 0 &&
55+
newRow < m &&
56+
newCol >= 0 &&
57+
newCol < n &&
58+
heights[newRow][newCol] >= heights[row][col] &&
59+
!(visited[newRow][newCol] & oceanMask)
60+
) {
61+
stack.push([newRow, newCol]);
62+
}
63+
}
64+
}
65+
}
66+
67+
// ํƒœํ‰์–‘ ์‹œ์ž‘์ ๋“ค
68+
const pacificStarts = [];
69+
for (let i = 0; i < m; i++) pacificStarts.push([i, 0]); // ์ฒซ ๋ฒˆ์งธ ์—ด
70+
for (let j = 1; j < n; j++) pacificStarts.push([0, j]); // ์ฒซ ๋ฒˆ์งธ ํ–‰ (์ค‘๋ณต ์ œ๊ฑฐ)
71+
72+
// ๋Œ€์„œ์–‘ ์‹œ์ž‘์ ๋“ค
73+
const atlanticStarts = [];
74+
for (let i = 0; i < m; i++) atlanticStarts.push([i, n - 1]); // ๋งˆ์ง€๋ง‰ ์—ด
75+
for (let j = 0; j < n - 1; j++) atlanticStarts.push([m - 1, j]); // ๋งˆ์ง€๋ง‰ ํ–‰ (์ค‘๋ณต ์ œ๊ฑฐ)
76+
77+
// ๊ฐ ๋ฐ”๋‹ค์—์„œ DFS ์‹คํ–‰
78+
dfs(pacificStarts, 1); // ํƒœํ‰์–‘: ๋น„ํŠธ 1
79+
dfs(atlanticStarts, 2); // ๋Œ€์„œ์–‘: ๋น„ํŠธ 2
80+
81+
return result;
82+
};

โ€Žsum-of-two-integers/clara-shin.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* ๋‘ ์ •์ˆ˜ a์™€ b๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, + ์™€ - ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‘ ์ˆ˜์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ
3+
*
4+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ•: ๋น„ํŠธ์—ฐ์‚ฐ / ALU ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•จ
5+
* 1. XOR ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•จ (์˜ฌ๋ฆผ์ˆ˜๋Š” ์ œ์™ธ)
6+
* 2. AND ์—ฐ์‚ฐ๊ณผ ์™ผ์ชฝ ์‹œํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ฌ๋ฆผ์ˆ˜๋ฅผ ๊ตฌํ•จ
7+
* 3. ์œ„์˜ ๋‘ ๊ณผ์ •์„ ์˜ฌ๋ฆผ์ˆ˜๊ฐ€ 0์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
8+
*
9+
* ์‹œ๊ฐ„๋ณต์žก๋„: O(log max(a,b)), ์ตœ๋Œ€ 32๋ฒˆ ๋ฐ˜๋ณต
10+
* ๊ณต๊ฐ„๋ณต์žก๋„: O(1)
11+
*/
12+
/**
13+
* @param {number} a
14+
* @param {number} b
15+
* @return {number}
16+
*/
17+
var getSum = function (a, b) {
18+
while (b !== 0) {
19+
// XOR: ์ž๋ฆฌ์˜ฌ๋ฆผ ์—†๋Š” ๋ง์…ˆ
20+
let sum = a ^ b;
21+
22+
// AND + ์‹œํ”„ํŠธ: ์ž๋ฆฌ์˜ฌ๋ฆผ ๊ณ„์‚ฐ
23+
let carry = (a & b) << 1;
24+
25+
// ๋‹ค์Œ ๋ฐ˜๋ณต์„ ์œ„ํ•ด ๊ฐ’ ์—…๋ฐ์ดํŠธ
26+
a = sum;
27+
b = carry;
28+
}
29+
30+
return a;
31+
};

0 commit comments

Comments
ย (0)