νλ‘κ·Έλλ¨Έμ€ λ¬Έμ νμ΄ - μμ μ°ΎκΈ° / μλΌν μ€ν λ€μ€μ 체
무방ν₯ κ·Έλν / λ°©ν₯ κ·Έλν / λλΉ μ°μ νμ / κ·Έλν λ°μ΄ν°λ² μ΄μ€ / κ°μ€ κ·Έλν
π μ²μ μμ±ν νμ΄
function solution(n) {
let noPrimeCount = 1;
for (let i = 2; i <= n; i++) {
for (let j = 2; j < i; j++) {
if (i % j === 0) {
noPrimeCount++;
break;
}
}
}
return n - noPrimeCount;
}
π λ λ²μ§Έ μμ±ν νμ΄
function solution(n) {
let nums = [];
for (let i = 2; i <= n; i++) {
nums.push(i);
}
const primes = nums.filter(num => {
for (let i = 2; i < num; i++) {
if (num % i === 0) {
return false;
}
}
return true;
});
return primes.length;
}
π λ€λ₯Έ μ¬λμ νμ΄
function solution(n) {
const primes = new Array(n+1).fill(true).fill(false, 0, 2);
// π‘ λ°°μ΄μ μΈλ±μ€λ₯Ό μ«μλ‘ νμ©ν κ²
// λ°λΌμ, n+1μ리 λ°°μ΄μ true(μμλ₯Ό μλ―Έ)λ‘ μ±μ΄ ν
// 0κ³Ό 1μ μμκ° μλλ―λ‘ μμ μ²μλΆν° falseλ‘ λ°κΏμ€
for (let i = 2; i * i <= n; i++) { // π‘ iλ (2 ~ 'nμ μ κ³±κ·Ό')κΉμ§ 1μ© μ¦κ°μν΄
if (primes[i] === true) { // λ°°μ΄μ iλ²μ§Έ μ리μ μλ κ°μ΄ trueλΌλ©΄(μ¦, i = μμ)
for (let j = i * i; j <= n; j += i) { // π‘ jλ i * iλΆν° μμλλ iμ λ°°μλ₯Ό μλ―Έν¨
primes[j] = false; // λ°°μ΄μ jλ²μ§Έ μ리μ μλ κ°λ€μ μ λΆ falseλ‘ λ°κΏμ€(β΅ j β μμ)
}
}
}
return primes.filter(e => e).length;
// κ°μ΄ trueμΈ μμ(=μμ)λ§ λ¨κΈ΄ λ°°μ΄μ κΈΈμ΄(=μμμ κ°μ)λ₯Ό 리ν΄
}
π κ·Έλνλ λ°μ΄ν°λ€μ μ΄λ»κ² μ°κ²°λμ΄ μλμ§λ₯Ό νμ νκΈ° μ¬μ΄ μλ£ κ΅¬μ‘°μ΄λ€.
π κ·Έλν μ©μ΄
μ μ κ°μ λ Έλλ‘ νν κ° μ μΌλ‘ νν ex. μ¬λ ex. μ¬λ κ° κ΄κ³
π‘ λνμ μΌλ‘ ν΄μ ν μ΄λΈμ μ΄μ©ν΄ ꡬν κ°λ₯νλ€
π 무방ν₯ κ·Έλν
μνΈ κ΄κ³
λ₯Ό νννλ κ·Έλν ex) νμ΄μ€λΆ μΉκ΅¬- κ·Έλ¦ΌμΌλ‘ ννν λ λ¨μ μ μ μ΄μ©νλ€
2μ°¨μ λ°°μ΄
μ κ΄κ³ 리μ€νΈλ₯Ό μ μ₯ν μ μλ€.
μ΄ κ²½μ°, aliceμ μ 체 μΉκ΅¬ 리μ€νΈλ₯Ό μκΈ° μν΄ O(N)μ΄ κ±Έλ¦°λ€.
const relationships = [
['alice', 'bob'],
['bob', 'cynthia'],
['alice', 'diana'],
['bob', 'diana']
];
λμ μ κ·Έλν
λ₯Ό μ΄μ©νλ©΄, O(1) λ§μ μ 체 μΉκ΅¬ 리μ€νΈ κ²μμ΄ κ°λ₯νλ€.
p.263
Rubyλ‘ κ΅¬νλ μ½λ β JavaScriptλ‘ λ³ν
const friends = {
'alice': ['bob', 'diana'],
'bob': ['alice', 'cynthia', 'diana'],
'cynthia': ['bob'],
'diana': ['alice', 'bob']
};
console.log(friends.alice); // ['bob', 'diana'] β O(1) λ§μ κ²μ κ°λ₯
π λ°©ν₯ κ·Έλν
λ°©ν₯μ±
μ΄ μλ κ΄κ³λ₯Ό νννλ κ·Έλν ex) νΈμν° νλ‘μ°- κ·Έλ¦ΌμΌλ‘ ννν λ νμ΄νλ₯Ό μ΄μ©νλ€
const follwees = {
'alice': ['bob', 'cynthia'],
'bob': ['cynthia'],
'cynthia': ['bob']
};
π‘ κ°μ²΄ μ§ν₯ ꡬνλ κ°λ₯νλ€
class Person {
constructor(name) {
this.name = name;
this.friends = [];
}
add_friend(friend) {
this.friends.push(friend);
}
}
const mary = new Person('mary');
const peter = new Person('peter');
mary.add_friend(peter);
peter.add_friend(mary);
κ·Έλνλ₯Ό μννλ λ°©λ²
μΌλ‘ λλΉ μ°μ νμκ³Ό κΉμ΄ μ°μ νμμ΄ μλ€ν(Queue)
λ₯Ό μ¬μ©νλ€[ μμ ]
λ§ν¬λμΈμ μ§μ λ€νΈμν¬ μΈμ 2μ°¨, 3μ°¨ 컀λ₯μ μ μ ν μ μλ κΈ°λ₯μ κ°μ§κ³ μλ€. μλ₯Ό λ€μ΄, (μ¨λ¦¬μ€ - λ°₯ - μ μμ)κ° μ°κ²°λμ΄ μμ λ, μ¨λ¦¬μ€λ λ°₯μ ν΅ν΄ μ μμμ μ°κ²°λλ―λ‘, μ μμλ μ¨λ¦¬μ€μ 2μ°¨ 컀λ₯μ μ΄λ€.
μ΄λ¬ν λΉμ§μ μ μΈ μ»€λ₯μ
μ λͺ¨λ ν¬ν¨ν΄ μ¨λ¦¬μ€μ μ 체 λ€νΈμν¬μ μλ μ΄λ¦μ νμ
νκ³ μ ν λ κ·Έλν νμ
μ μ΄μ©ν μ μλ€
[ μ½λ μ€λͺ ]
νμμ μ μ μ μμ (shift)ν΄ μ΄λ₯Ό νμ¬ μ μ (curr_vertex)μΌλ‘ μ§μ νλ€
κ° νμ¬ μ μ λ§λ€ κ·Έ μ μ μ μΈμ μ μ μ κ°κ°(forEach) λ°©λ¬Ένλ€
π‘ queue μΈμ visited_vertexμλ λ°©λ¬Έν λ Έλλ₯Ό νλμ© μΆκ°ν΄ κΈ°λ‘ν΄λμ ν μκ³ λ¦¬μ¦μ΄ μ’ λ£λμ λ μ΄λ¬ν λ Έλλ€μ visited μμ±μ λ€μ falseλ‘ λ°κΏμ€λ€ (μ΄λ―Έ λ°©λ¬Έν μ μ μ νμ λ£μ§ μκΈ° μν΄)
p.275
Rubyλ‘ κ΅¬νλ μ½λ β JavaScriptλ‘ λ³ν
μμ κ·Έλν κ°μ²΄ μ§ν₯ ꡬν μ½λμ 'λλΉ μ°μ νμ' λ©μλλ₯Ό μΆκ°ν¨
class Person {
constructor(name) {
this.name = name;
this.friends = [];
this.visited = false; // μΆκ°
}
// κ·Έλν λ§λ€κΈ° (κ΄κ³ μ€μ νκΈ°) β
add_friend(friend) {
this.friends.push(friend);
}
// λλΉ μ°μ νμ β
display_network() {
// λ°©λ¬Έν λ
Έλλ₯Ό κΈ°λ‘ν visited_vertex
const visited_vertex = [this];
// νλ₯Ό μμ±νλ€. μ²μμλ λ£¨νΈ μ μ μ ν¬ν¨νλ€.
const queue = [this];
this.visited = true;
while (queue.length) {
let curr_vertex = queue.shift(); // νλ‘λΆν° μ κ±°ν μ μ μ΄ νμ¬ μ μ μ΄λ€
console.log(curr_vertex.name);
curr_vertex.visited = true;
// νμ¬ μ μ μ μΈμ μ μ μ λͺ¨λ νμ μΆκ°νλ€
curr_vertex.friends.forEach(friend => {
if (!friend.visited) {
visited_vertex.push(friend);
queue.push(friend);
friend.visited = true;
}
});
}
// μκ³ λ¦¬μ¦μ μ’
λ£λ ν κ° λ
Έλμ 'visited' μμ±μ falseλ‘ ν λΉνλ€
visited_vertex.forEach(friend => friend.visited = true);
}
}
// κ·Έλν λ§λ€κΈ° (κ΄κ³ μ€μ νκΈ°)
const alice = new Person('alice');
const bob = new Person('bob');
const candy = new Person('candy');
const derek = new Person('derek');
const elaine = new Person('elaine');
alice.add_friend(bob);
alice.add_friend(candy);
alice.add_friend(derek);
alice.add_friend(elaine);
const fred = new Person('fred');
const helen = new Person('helen');
bob.add_friend(fred);
bob.add_friend(helen);
const gina = new Person('gina');
const irena = new Person('irena');
derek.add_friend(gina);
derek.add_friend(irena);
// κ·Έλν νμΈ
console.log(alice);
// λλΉ μ°μ νμ - aliceμ μ 체 λ€νΈμν¬μ μλ μ΄λ¦ νμ
alice.display_network();
[ μ μ μ²λ¦¬ ]
μμμ μ΄ν΄λ³Έ λ°λ‘λ,
κ·Έλνμ Vκ°μ μ μ μ΄ μμ λ, νμμ Vλ² μμ νλ€.
μ΄λ₯Ό λΉ μ€ νκΈ°λ²μΌλ‘O(V)
λΌκ³ λΆλ₯Έλ€.
μ΄λ, μ§κΈκΉμ§μ²λΌ Nκ°μ μ μ μ΄ μμ λ ν¨μ¨μ±μ O(N)μ΄λΌκ³ νμ§ μκ³ O(V)λΌκ³ νλ μ΄μ λ 무μμΌκΉ? μ΄λ λλΉ μ°μ νμμ΄ λ¨μν μ μ λ§ μ²λ¦¬νλ κ² μλλΌ κ°μ λ μ²λ¦¬
νλ λ¨κ³λ₯Ό μΆκ°λ‘ ν¬ν¨νκΈ° λλ¬Έμ΄λ€.
μ μ½λμμ νμ¬ μ μ μ μΈμ μ μ μ λͺ¨λ νμ μΆκ°νλ λΆλΆλ§ λΌμ΄μ μ΄ν΄λ³΄μ.
curr_vertex.friends.forEach(friend => {
if (!friend.visited) {
visited_vertex.push(friend);
queue.push(friend);
friend.visited = true;
}
});
νμ¬ μ μ μ μΈμ μ μ λ€μ visited μμ±μ΄ falseμΌ λλ§ νμ κ·Έ μΈμ μ μ μ μΆκ°νλλ‘ νμ§λ§, visited μμ±μ΄ trueμΈμ§ falseμΈμ§ μκΈ° μν΄μλ μ΄μ°¨νΌ λͺ¨λ μΈμ μ μ λ€μ μ λΆ λ°©λ¬Έν΄μΌ νλ€.
μλ₯Ό λ€μ΄, νμ¬ μ μ μ΄ bobμΈ κ²½μ°μ, fredλ visited μμ±μ΄ falseμ΄λ―λ‘ νμ μ§μ΄ λ£κ³ , aliceλ visited μμ±μ΄ trueμ΄λ―λ‘ νμ μ§μ΄λ£μ§λ μλλ€. μ΄λ νμ μ§μ΄λ£λ μ μ§μ΄λ£λ λ°©λ¬Έμ νλ―λ‘ λ¨κ³μλ ν¬ν¨μ΄ λλ€.
μμΈν μ΄ν΄λ³΄λ©΄, λλΉ μ°μ νμμμ μΈμ ν μ μ μ λ°©λ¬Ένλ νμλ κ·Έλνμ μλ κ°μ μμ 2λ°°μ΄λ€.
μ΄λ κ° κ°μ μ΄ λ μ μ μ μ°κ²°νκ³ , λͺ¨λ μ μ μ λν΄ μΈμ ν μ μ μ λͺ¨λ νμΈνκΈ° λλ¬Έμ΄λ€.μ΄ κ³Όμ μμ κ° κ°μ μ 2λ²μ© μ°μΈλ€.
[ κ°μ μ²λ¦¬ ]
κ·Έλνμ Eκ°μ κ°μ μ΄ μμ λ, μΈμ ν μ μ μ 2Eλ² νμΈνλ€.
μ΄λ₯Ό λΉ μ€ νκΈ°λ²μΌλ‘O(E)
λΌκ³ λΆλ₯Έλ€. (λΉ μ€λ μμ 무μ)
π‘ μ 리νλ©΄,
λλΉ μ°μ νμμ ν¨μ¨μ±
μ O(V+E)
λΌκ³ ν μ μλ€.
[ μμ ]
μλ‘κ° λͺ¨λ μ°κ²°λ 5λͺ μ μΉκ΅¬λ‘ μ΄λ€μ§ μμ λ€νΈμν¬κ° μλ€κ³ νμ.
κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ΄μ©ν΄ λ€μ― λͺ
μ μ 보λ₯Ό μ μ₯ν μ μλ€.
ν ν
μ΄λΈμλ κ° μ¬μ©μμ κ°μΈ μ 보λ₯Ό, λ€λ₯Έ ν
μ΄λΈμλ μΉκ΅¬λ€ κ° κ΄κ³(user_id, friend_id)λ₯Ό μ μ₯ν μ μλ€.
μ΄λ, 5λͺ μ€ 1λͺ μΈ Aκ° μμ μ λͺ¨λ μΉκ΅¬λ€μ κ°μΈ μ 보λ₯Ό μμ²νλ€κ³ νμ.
λ¨Όμ , μ ν리μΌμ΄μ μ κ΄κ³ ν μ΄λΈμμ Aμ user_idκ° μ ν μλ λͺ¨λ μ€μ μ°Ύμ μ 체 friend_id 리μ€νΈλ₯Ό λ§λ€μ΄μΌ νλ€. κ·Έ ν, κ°μΈ μ 보 ν μ΄λΈμμ friend_idμ λμνλ κ° μ€μ μ°ΎμμΌ νλ€.
(μμλ‘ λ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ κ²½μ°) μ΄μ§ κ²μμ΄ κ°λ₯νλ―λ‘ κ° μΉκ΅¬λ₯Ό κ²μνλ λ°λ O(logN)μ΄ κ±Έλ¦°λ€. μ 리νλ©΄, μΉκ΅¬κ° Mλͺ μΌ λ μ 보λ₯Ό κ°μ Έμ€λ ν¨μ¨μ±μ O(M logN)μ΄ λλ€.
κ·Έλν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ΄μ©ν΄ λ€μ― λͺ
μ μ 보λ₯Ό μ μ₯ν μλ μλ€.
λ°μ΄ν° λ² μ΄μ€ λ΄ κ° μ μ μ κ° μ¬μ©μμ λͺ¨λ μ 보λ₯Ό μ μ₯νλ€.
λ§μ°¬κ°μ§λ‘, 5λͺ μ€ 1λͺ μΈ aκ° μμ μ λͺ¨λ μΉκ΅¬λ€μ κ°μΈ μ 보λ₯Ό μμ²νλ€κ³ νμ.
μ ν리μΌμ΄μ μ κ·Έλν λ°μ΄ν°λ² μ΄μ€μμ Aλ₯Ό μ°Ύμ νμ Aμ 4λͺ μ μΉκ΅¬λ€μ΄ μ°κ²°λμ΄ μλ κ°μ μ μνν΄ μ 보λ₯Ό κ°μ Έμ¨λ€.
Aμ 4λͺ μ μΉκ΅¬λ€μ΄ κ°μ μΌλ‘ μ°κ²°λμ΄ μμΌλ―λ‘ κ° μΉκ΅¬μ μ 보λ₯Ό κ°μ Έμ€λ λ°λ λ± ν λ¨κ³κ° 걸릴 λΏμ΄λ€. μ 리νλ©΄, μΉκ΅¬κ° Nλͺ μΌ λ μ 보λ₯Ό κ°μ Έμ€λ ν¨μ¨μ±μ O(N)μ΄ λλ€.
κ°μ€ κ·Έλνλ κ·Έλνμ κ°μ μ μΆκ°μ μΈ μ λ³΄κ° ν¬ν¨
λ κ·Έλνλ₯Ό λ§νλ€.
무방ν₯ κ·Έλν
ex. κ° λμλ₯Ό μ μ μΌλ‘ νλ©°, κ° μ μ μ μλ κ°μ μλ λμλ€ κ° κ±°λ¦¬λ₯Ό λνλ΄λ μ«μκ° λΆμ΄ μλ κ·Έλν
λ°©ν₯ κ·Έλν
ex. κ° λμλ₯Ό μ μ μΌλ‘ νλ©°, κ° μ μ μ μλ κ°μ μλ ν λμμμ λ€λ₯Έ λμλ‘ κ°λ ν곡λ£λ₯Ό λνλ΄λ μ«μκ° λΆμ΄ μλ κ·Έλν (κ°μ μ νμ΄νκ° μλ μ μ΄κ³ , ν곡λ£λ μλ‘ λ€λ₯Ό μ μλ€)
ν΄μ ν
μ΄λΈ
μ μ΄μ©ν΄μΌ νλ€.p.284
Rubyλ‘ κ΅¬νλ μ½λ β JavaScriptλ‘ λ³ν
class City {
constructor(name) {
this.name = name;
this.routes = {}; // ν΄μ ν
μ΄λΈ o, λ°°μ΄ x
}
add_route(city, price) {
this.routes[city] = price; // κ°μ μ μΆκ° μ 보λ₯Ό ν¬ν¨
}
}
const dallas = new City('Dallas');
const toronto = new City('Toronto');
dallas.add_route(toronto, 138);
toronto.add_route(dallas, 216);
νλ‘κ·Έλλ¨Έμ€ λ¬Έμ νμ΄
μ± κ³μ μ½κΈ°