Skip to content

Commit 2b5d653

Browse files
authored
Merge pull request #1461 from byol-han/main
[byol-han] WEEK 07 solutions
2 parents 3f17312 + d3a4622 commit 2b5d653

File tree

5 files changed

+204
-0
lines changed

5 files changed

+204
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
3+
* @param {string} s
4+
* @return {number}
5+
*/
6+
var lengthOfLongestSubstring = function (s) {
7+
let longestS = [];
8+
let result = 0;
9+
for (let char of s) {
10+
if (!longestS.includes(char)) {
11+
longestS.push(char);
12+
} else {
13+
result = Math.max(result, longestS.length);
14+
longestS = longestS.slice(longestS.indexOf(char) + 1);
15+
longestS.push(char);
16+
}
17+
}
18+
return Math.max(result, longestS.length);
19+
};
20+
21+
/*
22+
Sliding Window
23+
Sliding Window는 문자열이나 배열에서 연속된 부분(subarray/substring)을 다룰 때 아주 유용한 알고리즘 기법
24+
고정되거나 유동적인 “창(window)”을 좌우로 움직이며 문제를 해결하는 방식
25+
26+
슬라이딩 윈도우 핵심 아이디어
27+
1. 두 포인터 사용: left, right
28+
2. 조건을 만족하는 윈도우 유지
29+
3. 조건이 깨지면 left를 이동
30+
4. 조건을 만족하면 결과 업데이트
31+
*/
32+
var lengthOfLongestSubstring = function (s) {
33+
let set = new Set();
34+
let left = 0;
35+
let maxLen = 0;
36+
37+
for (let right = 0; right < s.length; right++) {
38+
while (set.has(s[right])) {
39+
set.delete(s[left]); // 중복 문자 제거
40+
left++; // 왼쪽 포인터 이동
41+
}
42+
set.add(s[right]); // 현재 문자 추가
43+
maxLen = Math.max(maxLen, right - left + 1); // 최대 길이 업데이트
44+
}
45+
46+
return maxLen;
47+
};

number-of-islands/byol-han.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* https://leetcode.com/problems/number-of-islands/
3+
* @param {character[][]} grid
4+
* @return {number}
5+
*/
6+
var numIslands = function (grid) {
7+
if (!grid || grid.length === 0) return 0;
8+
9+
const rows = grid.length;
10+
const cols = grid[0].length;
11+
let count = 0;
12+
13+
const dfs = (r, c) => {
14+
// 경계 밖이거나 물인 경우 리턴
15+
if (r < 0 || c < 0 || r >= rows || c >= cols || grid[r][c] === "0") {
16+
return;
17+
}
18+
19+
// 방문 표시 (육지를 물로 바꿈)
20+
grid[r][c] = "0";
21+
22+
// 상하좌우 탐색
23+
dfs(r - 1, c); // 위
24+
dfs(r + 1, c); // 아래
25+
dfs(r, c - 1); // 왼쪽
26+
dfs(r, c + 1); // 오른쪽
27+
};
28+
29+
for (let r = 0; r < rows; r++) {
30+
for (let c = 0; c < cols; c++) {
31+
if (grid[r][c] === "1") {
32+
count++;
33+
dfs(r, c); // 해당 섬 전체 방문 처리
34+
}
35+
}
36+
}
37+
38+
return count;
39+
};

reverse-linked-list/byol-han.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val, next) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.next = (next===undefined ? null : next)
6+
* }
7+
*/
8+
/**
9+
* https://leetcode.com/problems/reverse-linked-list/
10+
* @param {ListNode} head
11+
* @return {ListNode}
12+
*/
13+
var reverseList = function (head) {
14+
let prev = null;
15+
let current = head;
16+
17+
while (current) {
18+
const next = current.next; // 다음 노드 기억
19+
current.next = prev; // 현재 노드가 이전 노드를 가리키도록 변경
20+
prev = current; // prev를 현재 노드로 이동
21+
current = next; // current를 다음 노드로 이동
22+
}
23+
24+
return prev; // prev는 새로운 head
25+
};
26+
27+
/*
28+
*** linked list ***
29+
리스트의 각 노드가 다음 노드를 가리키는 포인터를 가지고 있는 자료구조
30+
31+
리스트의 첫 번째 노드를 head라고 하고, head.next는 두 번째 노드, head.next.next는 세 번째 노드...
32+
이런식으로 노드들을 순차적으로 접근할 수 있는 자료구조를 '연결 리스트(linked list)'라고 함
33+
34+
reverseList(head)에서 head는 리스트 전체의 진입점.
35+
head 하나만 알고 있어도, .next를 따라가면서 전체 노드들을 순차적으로 접근할 수 있기 때문에 리스트 전체를 다룰 수 있음
36+
37+
*/

set-matrix-zeroes/byol-han.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/**
2+
* https://leetcode.com/problems/set-matrix-zeroes/
3+
* @param {number[][]} matrix
4+
* @return {void} Do not return anything, modify matrix in-place instead.
5+
*/
6+
var setZeroes = function (matrix) {
7+
const m = matrix.length;
8+
const n = matrix[0].length;
9+
10+
let firstRowHasZero = false;
11+
let firstColHasZero = false;
12+
13+
// 1. 첫 번째 열에 0이 있는지 확인
14+
for (let i = 0; i < m; i++) {
15+
if (matrix[i][0] === 0) {
16+
firstColHasZero = true;
17+
break;
18+
}
19+
}
20+
21+
// 2. 첫 번째 행에 0이 있는지 확인
22+
for (let j = 0; j < n; j++) {
23+
if (matrix[0][j] === 0) {
24+
firstRowHasZero = true;
25+
break;
26+
}
27+
}
28+
29+
// 3. 나머지 matrix에서 0을 찾고, 첫 행/열에 마킹
30+
for (let i = 1; i < m; i++) {
31+
for (let j = 1; j < n; j++) {
32+
if (matrix[i][j] === 0) {
33+
matrix[i][0] = 0; // i번째 행에 0 마킹
34+
matrix[0][j] = 0; // j번째 열에 0 마킹
35+
}
36+
}
37+
}
38+
39+
// 4. 마킹을 기준으로 행과 열을 0으로 변경
40+
for (let i = 1; i < m; i++) {
41+
for (let j = 1; j < n; j++) {
42+
if (matrix[i][0] === 0 || matrix[0][j] === 0) {
43+
matrix[i][j] = 0;
44+
}
45+
}
46+
}
47+
48+
// 5. 첫 번째 행을 0으로 설정
49+
if (firstRowHasZero) {
50+
for (let j = 0; j < n; j++) {
51+
matrix[0][j] = 0;
52+
}
53+
}
54+
55+
// 6. 첫 번째 열을 0으로 설정
56+
if (firstColHasZero) {
57+
for (let i = 0; i < m; i++) {
58+
matrix[i][0] = 0;
59+
}
60+
}
61+
};

unique-paths/byol-han.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* https://leetcode.com/problems/unique-paths/
3+
* @param {number} m
4+
* @param {number} n
5+
* @return {number}
6+
*/
7+
var uniquePaths = function (m, n) {
8+
// 2차원 배열 생성 (m행 n열), 모든 값을 1로 초기화
9+
const dp = Array.from({ length: m }, () => Array(n).fill(1));
10+
11+
// (1,1)부터 시작해서 경로 수 계산
12+
for (let i = 1; i < m; i++) {
13+
for (let j = 1; j < n; j++) {
14+
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
15+
}
16+
}
17+
18+
// 오른쪽 아래 모서리의 값이 정답
19+
return dp[m - 1][n - 1];
20+
};

0 commit comments

Comments
 (0)