-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
λ¬Έμ μ€λͺ | Insert Delete GetRandom O(1)
RandomizedSet ν΄λμ€λ₯Ό ꡬννλ λ¬Έμ λ‘, νκ· O(1) μκ° λ³΅μ‘λλ‘ μμμ μ½μ , μ κ±°, λλ€ μ νμ μνν μ μμ΄μΌ νλ€.
π μ μ½μ‘°κ±΄
-2^31 <= val <= 2^31 - 1insert,remove,getRandomν¨μλ μ΅λ 2 * 10^5λ² νΈμΆλ¨getRandomνΈμΆ μμ μλ μ΅μ νλμ μμκ° μ‘΄μ¬ν¨μ 보μ₯- λͺ¨λ ν¨μλ νκ· O(1) μκ° λ³΅μ‘λλ₯Ό κ°μ ΈμΌ ν¨
π‘ μμ
- Input:
["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
- Output:
[null, true, false, true, 2, true, false, 2]
λ¬Έμ ν΄κ²° κ³Όμ
Step 1: λ¬Έμ μ΄ν΄νκΈ°
RandomizedSet()- λΉ μ§ν© μμ±insert(1)- 1 μ½μ , μμμΌλ―λ‘ true λ°νremove(2)- 2 μ κ±° μλ, μμΌλ―λ‘ false λ°νinsert(2)- 2 μ½μ , μμμΌλ―λ‘ true λ°νgetRandom()- 1 λλ 2 μ€ νλλ₯Ό λλ€νκ² λ°ν (λμΌ νλ₯ )remove(1)- 1 μ κ±°, μμμΌλ―λ‘ true λ°νinsert(2)- 2 μ½μ μλ, μ΄λ―Έ μμΌλ―λ‘ false λ°νgetRandom()- 2λ§ μμΌλ―λ‘ 2 λ°ν
Step 2: μ κ·Ό λ°©λ²
μκ°λ³΅μ‘λ λΆμ:
insert: O(1)μΌλ‘ μμ μ‘΄μ¬ μ 무 νμΈ λ° μ½μremove: O(1)μΌλ‘ μμ μ‘΄μ¬ μ 무 νμΈ λ° μ κ±°getRandom: O(1)μΌλ‘ λλ€ μμ μ ν
μλ£κ΅¬μ‘° μ ν:
- Map: κ°μ μ‘΄μ¬ μ¬λΆμ λ°°μ΄μμμ μμΉ(μΈλ±μ€)λ₯Ό O(1)μ νμΈνκΈ° μν¨
- λ°°μ΄: λλ€ μμ μ νμ O(1)μ κ°λ₯νκ² νκΈ° μν¨
ν΅μ¬ μμ΄λμ΄:
- λ°°μ΄μμ μμ μ κ±°λ μΌλ°μ μΌλ‘ O(n)μ΄μ§λ§, μ κ±°ν μμλ₯Ό λ°°μ΄μ λ§μ§λ§ μμμ κ΅μ²΄ν ν λ§μ§λ§ μμλ₯Ό μ κ±°νλ©΄ O(1)μ κ°λ₯
Step 3: μ½λ μ€κ³
- μ΄κΈ°ν: Map(κ°->μΈλ±μ€)κ³Ό λ°°μ΄(κ° μ μ₯)μ μ μΈ
- insert ν¨μ:
- Mapμ κ°μ΄ μλμ§ νμΈ
- μμΌλ©΄ Mapμ (κ°, λ°°μ΄ κΈΈμ΄) μΆκ°νκ³ λ°°μ΄μ κ° μΆκ°
- κ²°κ³Ό λ°ν
- remove ν¨μ:
- Mapμ κ°μ΄ μλμ§ νμΈ
- μμΌλ©΄:
- ν΄λΉ κ°μ μΈλ±μ€λ₯Ό κ°μ Έμ΄
- λ°°μ΄μ λ§μ§λ§ κ°μ κ°μ Έμ΄
- μ κ±°ν κ°μ μμΉμ λ§μ§λ§ κ°μ λ£μ
- λ°°μ΄μμ λ§μ§λ§ κ°μ μ κ±°(pop)
- Mapμμ λ§μ§λ§ κ°μ μΈλ±μ€λ₯Ό μ λ°μ΄νΈ
- Mapμμ μ κ±°ν κ° μμ
- κ²°κ³Ό λ°ν
- getRandom ν¨μ:
- λ°°μ΄μμ λλ€ μΈλ±μ€ μμ±νμ¬ κ° λ°ν
Step 4: μ½λ ꡬν
var RandomizedSet = function() {
this.numMap = new Map(); // κ° -> μΈλ±μ€ λ§€ν
this.numList = []; // κ° μ μ₯ λ°°μ΄
};
/**
* @param {number} val
* @return {boolean}
*/
RandomizedSet.prototype.insert = function(val) {
let res = !this.numMap.has(val); // κ°μ΄ μμΌλ©΄ true
if (res) {
this.numMap.set(val, this.numList.length); // κ°κ³Ό μΈλ±μ€ μ μ₯
this.numList.push(val); // λ°°μ΄μ κ° μΆκ°
}
return res;
};
/**
* @param {number} val
* @return {boolean}
*/
RandomizedSet.prototype.remove = function(val) {
let res = this.numMap.has(val); // κ°μ΄ μμΌλ©΄ true
if (res) {
let idx = this.numMap.get(val); // μ κ±°ν κ°μ μΈλ±μ€
let lastVal = this.numList[this.numList.length - 1]; // λ§μ§λ§ κ°
this.numList[idx] = lastVal; // μ κ±°ν μμΉμ λ§μ§λ§ κ° μ½μ
this.numList.pop(); // λ§μ§λ§ κ° μ κ±°
this.numMap.set(lastVal, idx); // λ§μ§λ§ κ°μ μΈλ±μ€ μ
λ°μ΄νΈ
this.numMap.delete(val); // μ κ±°ν κ° μμ
}
return res;
};
/**
* @return {number}
*/
RandomizedSet.prototype.getRandom = function() {
return this.numList[Math.floor(Math.random() * this.numList.length)];
};