Skip to content

Commit e2b469a

Browse files
authored
Merge pull request #350 from seona926/main
[sophia] Week2 답안 제출
2 parents f83f926 + aaf8791 commit e2b469a

File tree

4 files changed

+180
-0
lines changed

4 files changed

+180
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val, left, right) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.left = (left===undefined ? null : left)
6+
* this.right = (right===undefined ? null : right)
7+
* }
8+
*/
9+
/**
10+
* @param {number[]} preorder
11+
* @param {number[]} inorder
12+
* @return {TreeNode}
13+
*/
14+
let buildTree = function (preorder, inorder) {
15+
if (preorder.length === 0 || inorder.length === 0) {
16+
return null;
17+
}
18+
19+
// 중위 순회의 값과 인덱스를 매핑하는 Map 생성
20+
const inorderIndexMap = new Map();
21+
inorder.forEach((value, index) => {
22+
inorderIndexMap.set(value, index);
23+
});
24+
25+
// 재귀적 트리 구성 함수
26+
function build(preStart, preEnd, inStart, inEnd) {
27+
if (preStart > preEnd || inStart > inEnd) {
28+
return null;
29+
}
30+
31+
// 전위순회 배열에서 루트 노드를 얻기
32+
const rootVal = preorder[preStart];
33+
const root = new TreeNode(rootVal);
34+
35+
// 중위순회 배열에서 루트 노드의 인덱스 찾기
36+
const rootIndexInInorder = inorderIndexMap.get(rootVal);
37+
38+
// 왼쪽 서브트리 크기 계산
39+
const leftSize = rootIndexInInorder - inStart;
40+
41+
// 재귀적으로 왼쪽과 오른쪽 서브트리를 생성
42+
root.left = build(
43+
preStart + 1,
44+
preStart + leftSize,
45+
inStart,
46+
rootIndexInInorder - 1
47+
);
48+
root.right = build(
49+
preStart + leftSize + 1,
50+
preEnd,
51+
rootIndexInInorder + 1,
52+
inEnd
53+
);
54+
55+
return root;
56+
}
57+
58+
return build(0, preorder.length - 1, 0, inorder.length - 1);
59+
};
60+
61+
/*
62+
1. 시간복잡도: O(n)
63+
- 트리의 모든 노드를 한 번씩 처리해야함
64+
2. 공간복잡도: O(n)
65+
- map 저장공간, 재귀호출 스택, 트리노드 저장공간 -> O(n)
66+
*/

counting-bits/seona926.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* @param {number} n
3+
* @return {number[]}
4+
*/
5+
let countBits = function (n) {
6+
let result = [];
7+
8+
for (let i = 0; i <= n; i++) {
9+
let binaryString = i.toString(2);
10+
11+
let count = 0;
12+
for (let item of binaryString) {
13+
if (item === "1") {
14+
count++;
15+
}
16+
}
17+
18+
result.push(count);
19+
}
20+
21+
return result;
22+
};
23+
24+
/*
25+
1. 시간복잡도 : O(nlogn)
26+
- 이진수 변환, 이진수 중 1의 개수를 세는 루프의 시간 복잡도: O(log i)
27+
- 작업이 총 n번 일어남
28+
2. 공간복잡도 : O(n)
29+
- result 배열의 공간 복잡도가 O(n)
30+
*/

decode-ways/seona926.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* @param {string} s
3+
* @return {number}
4+
*/
5+
let numDecodings = function (s) {
6+
// 입력받은 숫자가 decode될 수 있는 가짓수를 리턴하기
7+
const n = s.length;
8+
if (n === 0) return 0;
9+
10+
// dp[i]는 s[0...i-1]까지의 부분 문자열이 해석될 수 있는 방법의 수를 저장
11+
const dp = new Array(n + 1).fill(0);
12+
13+
// 빈 문자열은 하나의 방법으로 해석될 수 있음 (아무것도 선택하지 않는 방법)
14+
dp[0] = 1;
15+
16+
// 첫 글자가 '0'이 아니라면, 한 가지 방법으로 해석될 수 있음
17+
dp[1] = s[0] === "0" ? 0 : 1;
18+
19+
for (let i = 2; i <= n; i++) {
20+
const oneDigit = parseInt(s.slice(i - 1, i)); // 마지막 한 글자
21+
const twoDigits = parseInt(s.slice(i - 2, i)); // 마지막 두 글자
22+
23+
// 한 글자가 유효하다면, 그 글자를 포함하는 모든 방법을 추가
24+
if (oneDigit >= 1 && oneDigit <= 9) {
25+
dp[i] += dp[i - 1];
26+
}
27+
28+
// 두 글자가 유효하다면, 그 두 글자를 포함하는 모든 방법을 추가
29+
if (twoDigits >= 10 && twoDigits <= 26) {
30+
dp[i] += dp[i - 2];
31+
}
32+
}
33+
34+
return dp[n];
35+
};
36+
37+
/*
38+
1. 시간복잡도 : O(n)
39+
- 반복문의 시간복잡도
40+
2. 공간복잡도 : O(n)
41+
- dp 배열의 공간 복잡도
42+
*/
43+

valid-anagram/seona926.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* @param {string} s
3+
* @param {string} t
4+
* @return {boolean}
5+
*/
6+
let isAnagram = function (s, t) {
7+
let cntObj = {};
8+
9+
s.split("").forEach((item) => {
10+
if (cntObj[item]) {
11+
++cntObj[item];
12+
} else {
13+
cntObj[item] = 1;
14+
}
15+
});
16+
17+
for (let item of t) {
18+
if (cntObj[item] === undefined || cntObj[item] < 1) {
19+
return false;
20+
} else {
21+
--cntObj[item];
22+
}
23+
}
24+
25+
for (let count of Object.values(cntObj)) {
26+
if (count > 0) {
27+
return false;
28+
}
29+
}
30+
31+
return true;
32+
};
33+
34+
/*
35+
1. 시간복잡도 : O(n)
36+
각 반복문의 시간복잡도가 모두 O(n)
37+
38+
2. 공간복잡도 : O(n)
39+
주어진 문자열인 s와 t갯수만큼 공간을 차지함
40+
*/
41+

0 commit comments

Comments
 (0)