Skip to content

Commit 9fe16f7

Browse files
authored
Merge pull request #1522 from uraflower/main
[uraflower] Week 09 Solutions
2 parents af257ad + 3ca602b commit 9fe16f7

File tree

5 files changed

+211
-0
lines changed

5 files changed

+211
-0
lines changed

linked-list-cycle/uraflower.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val) {
4+
* this.val = val;
5+
* this.next = null;
6+
* }
7+
*/
8+
9+
/**
10+
* 연결 리스트의 사이클 여부를 반환하는 함수
11+
* 시간복잡도: O(n)
12+
* 공간복잡도: O(1)
13+
* @param {ListNode} head
14+
* @return {boolean}
15+
*/
16+
const hasCycle = function(head) {
17+
let node = head;
18+
19+
while (node?.next) {
20+
if (node.val === null) {
21+
return true;
22+
}
23+
node.val = null;
24+
node = node.next;
25+
}
26+
27+
return false;
28+
};
29+
30+
// 거북이와 토끼 알고리즘
31+
// 시간복잡도: O(n)
32+
// 공간복잡도: O(1)
33+
const hasCycle = function(head) {
34+
let slow = head; // 한 번에 한 노드씩
35+
let fast = head; // 한 번에 두 노드씩
36+
37+
while (fast?.next) {
38+
slow = slow.next;
39+
fast = fast.next.next;
40+
41+
// 한 번에 두 노드씩 가는 fast가
42+
// 자신보다 느린 slow랑 같은 경우가 생긴다면
43+
// 사이클이 있다는 뜻
44+
if (slow === fast) {
45+
return true;
46+
}
47+
}
48+
49+
return false;
50+
};

maximum-product-subarray/uraflower.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* 주어진 배열에서 가장 큰 부분 배열의 곱을 반환하는 함수
3+
* @param {number[]} nums
4+
* @return {number}
5+
*/
6+
const maxProduct = function (nums) {
7+
let min = nums[0];
8+
let max = nums[0];
9+
let result = nums[0]; // 현재까지 가장 큰 부분 배열 곱을 저장
10+
11+
for (let i = 1; i < nums.length; i++) {
12+
let tempMin = Math.min(nums[i], min * nums[i], max * nums[i]);
13+
let tempMax = Math.max(nums[i], min * nums[i], max * nums[i]);
14+
min = tempMin;
15+
max = tempMax;
16+
result = Math.max(result, max);
17+
}
18+
19+
return result;
20+
}
21+
22+
// 시간복잡도: O(n)
23+
// 공간복잡도: O(1)

minimum-window-substring/uraflower.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* @param {string} s
3+
* @param {string} t
4+
* @return {string}
5+
*/
6+
const minWindow = function (s, t) {
7+
const counter = Array.from(t).reduce((obj, char) => {
8+
obj[char] = (obj[char] || 0) + 1;
9+
return obj;
10+
}, {});
11+
12+
let lettersToSatisfy = Object.keys(counter).length;
13+
let minStart = 0;
14+
let minEnd = Infinity;
15+
16+
let start = 0;
17+
for (let end = 0; end < s.length; end++) {
18+
// s[end]가 t에 포함된 문자인 경우
19+
if (s[end] in counter) {
20+
counter[s[end]]--;
21+
22+
// 해당 문자가 범위 안에 모두 포함된 경우
23+
if (counter[s[end]] === 0) {
24+
lettersToSatisfy--;
25+
}
26+
}
27+
28+
// 현재 범위에 t 내 모든 문자가 포함된 경우
29+
while (lettersToSatisfy === 0) {
30+
// 더 작은 범위로 정답 갱신
31+
if (end - start < minEnd - minStart) {
32+
minStart = start;
33+
minEnd = end;
34+
}
35+
36+
// start 늘리기
37+
if (s[start] in counter) {
38+
counter[s[start]]++;
39+
if (counter[s[start]] > 0) {
40+
lettersToSatisfy++;
41+
}
42+
}
43+
44+
start++;
45+
}
46+
}
47+
48+
return minEnd === Infinity ? '' : s.slice(minStart, minEnd + 1);
49+
};
50+
51+
// 시간복잡도: O(m) (m: s.length)
52+
// 공간복잡도: O(1)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* @param {number[][]} heights
3+
* @return {number[][]}
4+
*/
5+
const pacificAtlantic = function (heights) {
6+
// 각 cell에서 시작해서 바다로 뻗어나가는 것 말고
7+
// 바다에서 시작해서 각 cell이 바다로 흘러올 수 있는지 확인한 후
8+
// 두 바다에 모두 흘러갈 수 있는 cell만 filter
9+
10+
const rows = heights.length;
11+
const cols = heights[0].length;
12+
13+
// 각 바다에 도달 가능한지 여부를 담는 visited를 만듦
14+
const pacific = Array.from({ length: rows }, () => Array(cols).fill(false));
15+
const atlantic = Array.from({ length: rows }, () => Array(cols).fill(false));
16+
17+
const direction = [[0, 1], [0, -1], [1, 0], [-1, 0]];
18+
19+
// 순회
20+
function bfs(r, c, visited) {
21+
visited[r][c] = true;
22+
23+
const queue = [[r, c]];
24+
25+
while (queue.length) {
26+
const [r, c] = queue.shift();
27+
28+
for (const [dr, dc] of direction) {
29+
const nr = r + dr;
30+
const nc = c + dc;
31+
32+
// 나보다 height가 크고, 방문한 적 없으면, 큐에 담기
33+
if (0 <= nr && nr < rows && 0 <= nc && nc < cols
34+
&& !visited[nr][nc]
35+
&& heights[nr][nc] >= heights[r][c]
36+
) {
37+
queue.push([nr, nc]);
38+
visited[nr][nc] = true;
39+
}
40+
}
41+
}
42+
}
43+
44+
// 바다에서 시작해서 거꾸로 탐색
45+
for (let r = 0; r < rows; r++) {
46+
bfs(r, 0, pacific); // left
47+
bfs(r, cols - 1, atlantic); // right
48+
}
49+
50+
for (let c = 0; c < cols; c++) {
51+
bfs(0, c, pacific); // top
52+
bfs(rows - 1, c, atlantic); // bottom
53+
}
54+
55+
// 태평양, 대서양으로 모두 flow할 수 있는 cell 찾기
56+
const result = [];
57+
58+
for (let r = 0; r < rows; r++) {
59+
for (let c = 0; c < cols; c++) {
60+
if (pacific[r][c] && atlantic[r][c]) {
61+
result.push([r, c]);
62+
}
63+
}
64+
}
65+
66+
return result;
67+
};
68+
69+
// 시간복잡도: O(m*n)
70+
// 공간복잡도: O(m*n)

sum-of-two-integers/uraflower.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* +, - 연산자를 사용하지 않고 a, b를 더하는 함수
3+
* @param {number} a
4+
* @param {number} b
5+
* @return {number}
6+
*/
7+
const getSum = function (a, b) {
8+
while (b !== 0) {
9+
[a, b] = [a ^ b, (a & b) << 1]
10+
}
11+
12+
return a;
13+
};
14+
15+
// 시간복잡도: O(1)
16+
// 공간복잡도: O(1)

0 commit comments

Comments
 (0)