
νλ‘κ·Έλλ¨Έμ€ λ¬Έμ  νμ΄ - μμ μ°ΎκΈ° / μλΌν μ€ν λ€μ€μ 체
무방ν₯ κ·Έλν / λ°©ν₯ κ·Έλν / λλΉ μ°μ νμ / κ·Έλν λ°μ΄ν°λ² μ΄μ€ / κ°μ€ κ·Έλν
π μ²μ μμ±ν νμ΄
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);
νλ‘κ·Έλλ¨Έμ€ λ¬Έμ  νμ΄
μ± κ³μ μ½κΈ°