Skip to content

Commit bace583

Browse files
authored
Merge pull request #1162 from JANGSEYEONG/main
[JANGSEYEONG] WEEK 01 solutions
2 parents 92dcf72 + 339053b commit bace583

File tree

5 files changed

+184
-0
lines changed

5 files changed

+184
-0
lines changed

β€Žcontains-duplicate/JANGSEYEONG.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
μ‹œκ°„λ³΅μž‘λ„: O(n) - new Set(nums)μ—μ„œ λ°°μ—΄ μš”μ†Œ μˆœνšŒν•˜λ©° Set 생성 O(n) + 길이 비ꡐ O(1)
3+
- Set μžλ£Œκ΅¬μ‘°λŠ” μ€‘λ³΅λœ 값을 μžλ™μœΌλ‘œ 제거
4+
*/
5+
6+
/**
7+
* @param {number[]} nums
8+
* @return {boolean}
9+
*/
10+
var containsDuplicate = function (nums) {
11+
// Set으둜 λ§Œλ“€μ—ˆμ„ λ•Œ, κΈ°μ‘΄ λ°°μ—΄κ³Ό μ‚¬μ΄μ¦ˆκ°€ λ‹€λ₯΄λ©΄ 쀑볡이 μ œκ±°λœκ±°μž„
12+
const numsSet = new Set(nums);
13+
return nums.length !== numsSet.size;
14+
};

β€Žhouse-robber/JANGSEYEONG.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* μ‹œκ°„λ³΅μž‘λ„: O(n) - 배열을 ν•œ 번만 순회
3+
* κ³΅κ°„λ³΅μž‘λ„: O(n) - 길이가 n+1인 DP λ°°μ—΄ μ‚¬μš©
4+
*
5+
* @param {number[]} nums
6+
* @return {number}
7+
*/
8+
var rob = function (nums) {
9+
// arr[i] = i번째 μ§‘λΆ€ν„° λ§ˆμ§€λ§‰ μ§‘κΉŒμ§€ κ³ λ €ν–ˆμ„ λ•Œ ν›”μΉ  수 μžˆλŠ” μ΅œλŒ€ κΈˆμ•‘
10+
const arr = new Array(nums.length + 1);
11+
12+
// μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ§‘(n+1번째)은 0, 점화식을 μœ„ν•œ κ³„μ‚°μš© κ³΅κ°„μž„
13+
arr[nums.length] = 0;
14+
15+
// λ§ˆμ§€λ§‰ μ§‘λ§Œ κ³ λ €ν•˜λ©΄ κ·Έ μ§‘μ˜ κΈˆμ•‘μ΄ μ΅œλŒ€κ°’ (이후 집듀은 μ—†μœΌλ‹ˆκΉŒ 0으둜 κ³„μ‚°ν•œ κ²°κ³Ό)
16+
arr[nums.length - 1] = nums[nums.length - 1];
17+
18+
// λ’€μ—μ„œλΆ€ν„° 계산
19+
for (let i = nums.length - 2; i >= 0; i--) {
20+
// i번째 μ§‘μ—μ„œμ˜ κ²°μ •:
21+
// 1. i번째 집을 ν„Έκ³  (i+2)번째 μ§‘λΆ€ν„° ν›”μΉ˜λŠ” 경우: nums[i] + arr[i+2]
22+
// 2. i번째 집을 ν„Έμ§€ μ•Šκ³  (i+1)번째 μ§‘λΆ€ν„° ν›”μΉ˜λŠ” 경우: arr[i+1]
23+
// 두 κ°€μ§€ 쀑 μ΅œλŒ€κ°’μ„ 선택
24+
arr[i] = Math.max(nums[i] + arr[i + 2], arr[i + 1]);
25+
}
26+
27+
// arr[0]은 0번째 μ§‘λΆ€ν„° κ³ λ €ν–ˆμ„ λ•Œ ν›”μΉ  수 μžˆλŠ” μ΅œλŒ€ κΈˆμ•‘
28+
return arr[0];
29+
};
30+
31+
/* 풀이 μ„€λͺ…:
32+
* 문제의 핡심: μΈμ ‘ν•œ 집은 μ—°μ†ν•΄μ„œ ν„Έ 수 없을 λ•Œ μ΅œλŒ€λ‘œ ν„Έ 수 μžˆλŠ” κΈˆμ•‘ μ°ΎκΈ°
33+
*
34+
* μ ‘κ·Ό 방식: λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°
35+
*
36+
* 1. μƒνƒœ μ •μ˜:
37+
* - f(n) = n번째 μ§‘λΆ€ν„° λ§ˆμ§€λ§‰ μ§‘κΉŒμ§€ κ³ λ €ν–ˆμ„ λ•Œ ν„Έ 수 μžˆλŠ” μ΅œλŒ€ κΈˆμ•‘
38+
*
39+
* 2. 점화식 λ„μΆœ:
40+
* - 각 μ§‘λ§ˆλ‹€ 두 κ°€μ§€ 선택이 있음:
41+
* 1) ν˜„μž¬ 집을 ν„ΈκΈ°: ν˜„μž¬ μ§‘μ˜ 돈 + 두 μ§‘ μ΄ν›„λΆ€ν„°μ˜ μ΅œλŒ€ κΈˆμ•‘
42+
* 2) ν˜„μž¬ 집을 ν„Έμ§€ μ•ŠκΈ°: λ‹€μŒ μ§‘λΆ€ν„°μ˜ μ΅œλŒ€ κΈˆμ•‘
43+
* - λ”°λΌμ„œ 점화식: f(n) = max(nums[n] + f(n+2), f(n+1))
44+
*
45+
* 3. 베이슀 μΌ€μ΄μŠ€:
46+
* - μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ§‘: f(n+1) = 0
47+
* - λ§ˆμ§€λ§‰ μ§‘: f(n) = nums[n]
48+
*
49+
* 4. 계산 λ°©ν–₯:
50+
* - λ’€μ—μ„œλΆ€ν„° μ•žμœΌλ‘œ 계산 (Bottom-up)
51+
* - λ§ˆμ§€λ§‰ μ§‘λΆ€ν„° μ‹œμž‘ν•΄μ„œ 첫 번째 μ§‘κΉŒμ§€ 각 μœ„μΉ˜μ—μ„œμ˜ μ΅œλŒ€ κΈˆμ•‘ 계산
52+
*
53+
* μ˜ˆμ‹œ [1,2,3,1]:
54+
* - f(4) = 0 (μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ§‘)
55+
* - f(3) = 1 (λ§ˆμ§€λ§‰ μ§‘)
56+
* - f(2) = max(3 + f(4), f(3)) = max(3 + 0, 1) = 3
57+
* - f(1) = max(2 + f(3), f(2)) = max(2 + 1, 3) = 3
58+
* - f(0) = max(1 + f(2), f(1)) = max(1 + 3, 3) = 4
59+
* - κ²°κ³Ό: 4 (졜적의 선택은 0λ²ˆμ§Έμ™€ 2번째 μ§‘ ν„ΈκΈ°)
60+
*/
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
μ‹œκ°„λ³΅μž‘λ„: O(n) - λͺ¨λ“  μš”μ†Œμ— λŒ€ν•΄ μ΅œλŒ€ ν•œ λ²ˆμ”©λ§Œ κ²€μ‚¬ν•˜κΈ° λ•Œλ¬Έ
3+
- Set을 μ‚¬μš©ν•˜μ—¬ O(1) μ‹œκ°„μ— μš”μ†Œ 쑴재 μ—¬λΆ€ 확인 κ°€λŠ₯
4+
- 각 μˆ«μžλŠ” 연속 μˆ˜μ—΄μ˜ μ‹œμž‘μ μΈ κ²½μš°μ—λ§Œ while 루프λ₯Ό μ‹€ν–‰
5+
-> λͺ¨λ“  μš”μ†Œμ— λŒ€ν•΄ while λ£¨ν”„μ˜ 총 반볡 νšŸμˆ˜λŠ” 전체 μš”μ†Œ 수λ₯Ό μ΄ˆκ³Όν•˜μ§€ μ•ŠμŒ
6+
*/
7+
/**
8+
* @param {number[]} nums
9+
* @return {number}
10+
*/
11+
12+
var longestConsecutive = function (nums) {
13+
const numSet = new Set(nums);
14+
let longest = 0;
15+
16+
for (let n of [...numSet]) {
17+
if (!numSet.has(n - 1)) {
18+
let length = 0;
19+
while (numSet.has(n + length)) {
20+
length += 1;
21+
}
22+
longest = Math.max(length, longest);
23+
}
24+
}
25+
return longest;
26+
};
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
μ‹œκ°„λ³΅μž‘λ„: O(n) - 배열을 두 번 μˆœνšŒν•˜μ§€λ§Œ μ—¬μ „νžˆ μ„ ν˜•
3+
λ°°μ—΄μ—μ„œ 0의 κ°œμˆ˜μ— 따라 κ²°κ³Όκ°€ λ‹¬λΌμ§€λŠ” 점을 이용
4+
- 0이 두 개 이상: λͺ¨λ“  κ²°κ³ΌλŠ” 0
5+
- 0이 ν•˜λ‚˜: 0 μœ„μΉ˜λ§Œ 전체곱, λ‚˜λ¨Έμ§€λŠ” 0
6+
- 0이 μ—†μŒ: 전체곱 Γ· ν˜„μž¬ μ›μ†Œ
7+
*/
8+
9+
/**
10+
* @param {number[]} nums
11+
* @return {number[]}
12+
*/
13+
var productExceptSelf = function (nums) {
14+
// 0이 μžˆλŠ” μœ„μΉ˜λ“€ 체크용
15+
const zeros = new Map();
16+
17+
// 전체 κ³± κ΅¬ν•˜κΈ° - O(n)
18+
const allProductExceptZero = nums.reduce((acc, x, i) => {
19+
if (x === 0) zeros.set(i, true);
20+
return x !== 0 ? acc * x : acc;
21+
}, 1);
22+
23+
// λ°°μ—΄ 전체 λŒλ©΄μ„œ 쑰건에 맞게 return μ‹œν‚€κΈ° - O(n)
24+
return nums.map((x, i) => {
25+
// 0이 2개 이상이라면 무쑰건 0
26+
if (zeros.size > 1) {
27+
return 0;
28+
}
29+
30+
// 0이 1개일 λ•Œ
31+
if (zeros.size === 1) {
32+
// 그게 λ‚˜μΌ λ•Œ
33+
if (zeros.has(i)) return allProductExceptZero;
34+
35+
// 그게 λ‹€λ₯Έμ• μΌ λ•Œ
36+
return 0;
37+
}
38+
39+
// 0이 없을 λ•Œ
40+
return allProductExceptZero / x;
41+
});
42+
};

β€Žtwo-sum/JANGSEYEONG.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
μ‹œκ°„λ³΅μž‘λ„: O(nΒ²)
3+
- nums.indexOf()λŠ” λ°°μ—΄ 전체λ₯Ό μˆœνšŒν•˜λŠ” O(n) μž‘μ—…
4+
- 이 μž‘μ—…μ΄ for 루프(O(n)) λ‚΄λΆ€μ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ 전체 μ‹œκ°„λ³΅μž‘λ„λŠ” O(n) * O(n) = O(nΒ²)
5+
6+
var twoSum = function (nums, target) {
7+
for (let i = 0; i < nums.length; i++) {
8+
let x = nums.indexOf(target - nums[i]);
9+
if (x > -1 && x !== i) {
10+
return [i, x];
11+
}
12+
}
13+
return [];
14+
};
15+
16+
*/
17+
18+
/*
19+
μ‹œκ°„λ³΅μž‘λ„: O(n) - 전체 배열을 ν•œ 번만 순회 O(n) + ν‚€-κ°’ 쌍 μ €μž₯에 O(1)
20+
- Map λŒ€μ‹  객체(Object)λ₯Ό μ‚¬μš©ν•΄λ„ 될듯 함
21+
- 일반 κ°μ²΄λŠ” {}, 접근은 obj[key]둜 κ°€λŠ₯, has() λŒ€μ‹  (key in obj) λ˜λŠ” obj[key] !== undefined λ˜λŠ” key in obj μ‚¬μš© κ°€λŠ₯ */
22+
/**
23+
* @param {number[]} nums
24+
* @param {number} target
25+
* @return {number[]}
26+
*/
27+
var twoSum = function (nums, target) {
28+
let minus = new Map();
29+
for (let i = 0; i < nums.length; i++) {
30+
let current = nums[i];
31+
32+
// ν˜„μž¬ μˆ«μžκ°€ 이전에 μ €μž₯된 보수(complement)와 μΌμΉ˜ν•˜λŠ”μ§€ 확인 - Map 객체의 hasλŠ” O(1) μ—°μ‚°
33+
if (minus.has(current)) {
34+
return [minus.get(current), i];
35+
}
36+
37+
// ν˜„μž¬ 숫자의 보수(target-current)와 인덱슀λ₯Ό 맡에 μ €μž₯ - Map 객체의 set은 O(1) μ—°μ‚°
38+
minus.set(target - current, i);
39+
}
40+
41+
return [];
42+
};

0 commit comments

Comments
Β (0)