π νλ‘κ·Έλλ¨Έμ€ 133500 : λ±λ - Javascript
λ¬Έμ μ€λͺ
μΈμ² μλ°λ€μλ 1λΆν° nκΉμ§ μλ‘ λ€λ₯Έ λ²νΈκ° λ§€κ²¨μ§ λ±λ nκ°κ° μ‘΄μ¬ν©λλ€. λ±λμ λ±λ μ¬μ΄λ₯Ό μ€κ°λ λ±κΈΈμ΄ n-1κ° μ‘΄μ¬νμ¬, μ΄λ λ±λμμ μΆλ°ν΄λ λ€λ₯Έ λͺ¨λ λ±λκΉμ§ μ΄λν μ μμ΅λλ€. λ±λ κ΄λ¦¬μ μ€μ±μ΄λ μ λ ₯μ μλΌκΈ° μνμ¬, μ΄ μ€ λͺ κ°μ λ±λλ§ μΌ λλ €κ³ ν©λλ€. νμ§λ§ λ±λλ₯Ό μ무λ κ²λ κΊΌλ²λ¦¬λ©΄, λ±κΈΈμ μ€κ°λ λ°°λ€μ΄ μνν μ μμ΅λλ€. ν λ±κΈΈμ μμͺ½ λ λ±λ μ€ μ μ΄λ νλλ μΌμ Έ μλλ‘ λ±λλ₯Ό μΌ λμ΄μΌ ν©λλ€.
μλ₯Ό λ€μ΄, μλ κ·Έλ¦Όκ³Ό κ°μ΄ λ±λ 8κ°μ 7κ°μ λ±κΈΈλ€μ΄ μλ€κ³ ν©μλ€. μ΄ κ²½μ° 1λ² λ±λμ 5λ² λ±λ λ κ°λ§ μΌ λμ΄λ λͺ¨λ λ±κΈΈμ μμͺ½ λ λ±λ μ€ νλκ° μΌμ Έ μμΌλ―λ‘, λ°°λ€μ μμ νκ² μ΄νν μ μμ΅λλ€.
λ±λμ κ°μ n
κ³Ό κ° λ±κΈΈμ΄ μ°κ²°λ λ±λμ λ²νΈλ₯Ό λ΄μ μ΄μ°¨μ λ°°μ΄ lighthouse
κ° λ§€κ°λ³μλ‘ μ£Όμ΄μ§λλ€. μ€μ±μ΄κ° μΌ λμ΄μΌ νλ λ±λ κ°μμ μ΅μκ°μ return νλλ‘ solution ν¨μλ₯Ό μμ±ν΄μ£ΌμΈμ.
μ νμ¬ν
- 2 β€
n
β€ 100,000 lighthouse
μ κΈΈμ΄ =n β 1
lighthouse
λ°°μ΄μ κ° ν[a, b]
λa
λ² λ±λμb
λ² λ±λκ° λ±κΈΈλ‘ μ°κ²°λμ΄ μλ€λ μλ―Έμ λλ€.- 1 β€
a
βb
β€n
- λͺ¨λ λ±λλ μλ‘ λ€λ₯Έ λ±λλ‘ μ΄λν μ μλ λ±κΈΈμ΄ μ‘΄μ¬νλλ‘ μ λ ₯μ΄ μ£Όμ΄μ§λλ€.
- 1 β€
μ μΆλ ₯ μ
n | lighthouse | result |
---|---|---|
8 | [[1, 2], [1, 3], [1, 4], [1, 5], [5, 6], [5, 7], [5, 8]] | 2 |
40 | [[4, 1], [5, 1], [5, 6], [7, 6], [1, 2], [1, 3], [6, 8], [2, 9], [9, 10]] | 3 |
-
μμ #1
λ³Έλ¬Έμμ μ€λͺ ν μμμ λλ€. -
μμ #2
λ±κΈΈμ μλ κ·Έλ¦Όκ³Ό κ°μ΄ μ°κ²°λμ΄ μμ΅λλ€. μ€μ±μ΄κ° μ΄μ€ 1, 6, 9λ² λ±λ 3κ°λ§ μΌ λμ΄λ λͺ¨λ λ±κΈΈμ μμͺ½ λ λ±λ μ€ νλκ° μΌμ Έ μκ² λκ³ , μ΄λμ λ±λ κ°μ 3κ°κ° μ΅μκ° λ©λλ€.
νμ΄ κ³Όμ
λ¨Όμ μ£Όμ΄μ§ 쑰건μ νμ ν΄λ΄ μλ€.
-
쑰건 1.
lighthouse
μ κΈΈμ΄ =n β 1
λ±λ μ¬μ΄μ κΈΈμ μκ° λ±λμ μ -1
μ΄λΌλ μ΄ μ‘°κ±΄μ λ±λμ μμ κΈΈμ μκ° λμΌν μλμ κ°μ ννμ λ±κΈΈκ° μ‘΄μ¬νμ§ μμμ μλ €μ€λλ€. -
쑰건 2. λͺ¨λ λ±λλ μλ‘ λ€λ₯Έ λ±λλ‘ μ΄λν μ μλ λ±κΈΈμ΄ μ‘΄μ¬νλλ‘ μ λ ₯μ΄ μ£Όμ΄μ§λλ€.
λͺ¨λ λ±λλ λ€λ₯Έ λ±λμ κΈΈμ΄ μ°κ²°λμ΄ μλ€
λΌλ μ΄ μ‘°κ±΄μ μλμ κ°μ ννμ λ±κΈΈμ΄ μ‘΄μ¬νμ§ μμμ μλ €μ€λλ€.
μ λκ°μ§ 쑰건μ ν΅ν΄ λ±κΈΈμλ νμ λμ μμΉν λ±λκ° μ‘΄μ¬νκ³ , λͺ¨λ λ±λλ 1κ° μ΄μμ κΈΈκ³Ό μ°κ²°λμ΄μμμ νμ νμ΅λλ€.
μ΄μ κ°μ₯ μ μ μμ λ±λλ§ μΌκΈ° μν΄ λ°λμ μΌμ ΈμΌνλ λ±λλ₯Ό μ°ΎμμΌν©λλ€.
λ¨Όμ λμ μμΉν λ±λ, μ¦, κΈΈμ΄ 1κ°λΏμΈ λ±λλ λ°λμ μμ νΉμ μ°κ²°λ λ±λκ° μΌμ ΈμΌν©λλ€. μ΄λ μμ μ μΌλ κ²½μ°μ 무쑰건 1κ°μ κΈΈλ§ λ°νμ§μ§λ§ μ°κ²°λ λ±λμ λΆλΉμ μΌ€ κ²½μ° μ¬λ¬κ°μ κΈΈμ΄ λ°νμ§ μ μκΈ° λλ¬Έμ μ°κ²°λ λ±λμ λΆλΉμ μΌλλ‘ ν©λλ€.
μ΄ ν λΆλΉμ μν₯μ λ°μ λΆλΉμ΄ νμ μμ΄μ§ λ±λλ₯Ό λͺ©λ‘μμ μ κ±°νκ³ μ΄ κ³Όμ μ λ°λ³΅ν΄ λ°λμ λΆλΉμ΄ μΌμ ΈμΌνλ μ΅μνμ λ±λμ μλ₯Ό ꡬν μ μμ΅λλ€.
λ¨Όμ λ±λμ μ°κ²°κ΄κ³λ₯Ό κ΄λ¦¬νκΈ° μν΄ LightHouse ν΄λμ€λ₯Ό μμ±νμ΅λλ€.
λ±λ λ²νΈλ₯Ό λ΄λ id
, μ°κ²°λ λ±λ κ°μ²΄λ₯Ό λ΄λ connects
λ₯Ό κ°μ§ ν΄λμ€μ
λλ€.
μ°κ²°κ³Ό μ°κ²° ν΄μ λ₯Ό μ²λ¦¬νλ λ©μλκΉμ§ λ¨Όμ μμ±ν΄λκ² μ΅λλ€.
class Lighthouse {
constructor(id) {
this.id = id;
this.connects = new Map();
}
//λ€λ₯Έ λ±λμ μ°κ²°μν€λ ν¨μ
//μμ κ³Ό λ€λ₯Έ λ±λμ μ°κ²° λͺ©λ‘μ μλ‘λ₯Ό μΆκ°ν¨
connect(target) {
this.connects.set(target.id, target);
target.connects.set(this.id, this);
}
//λ€λ₯Έ λ±λμ μ°κ²°μ ν΄μ μν€λ ν¨μ
disconnect(target) {
this.connects.delete(target.id);
target.connects.delete(this.id);
}
}
κ·Έ ν solution ν¨μμμ λͺ¨λ λ±λμ μ°κ²° κ΄κ³λ₯Ό κΈ°λ‘ν©λλ€.
μ λ λ±λ κ°μ²΄μμ ꡬλΆμ μν΄ solution ν¨μμ μΈμλ₯Ό lighthouse
λμ connects
λ‘ λ³κ²½νμ΅λλ€.
function solution(n, connects) {
//nκ°μ λ±λ κ°μ²΄κ° λ΄κΈ΄ 2μ°¨μ λ°°μ΄ μμ±
const lighthouses = new Map(
[...Array(n).keys()].map(i => [i + 1, new Lighthouse(i + 1)])
);
//λͺ¨λ λ±λμ μ°κ²° κ΄κ³λ₯Ό μ μ©
connects
.map(([a, b]) => [lighthouses.get(a), lighthouses.get(b)])
.forEach(([a, b]) => a.connect(b));
return 0;
}
μμ κ³Ό μ°κ²°λ λ±λμ μκ° 1κ°μΈμ§ νμΈ νλ λ©μλμ μ κ±°ν μ μλ λ±λμ λͺ©λ‘μ λ°ννλ λ©μλλ₯Ό μμ±νμ΅λλ€.
//μ°κ²°λ λ±λμ μκ° 1κ°μΈμ§ νμΈνλ ν¨μ
//μ°κ²°λ λ±λμ μκ° 1κ°μΈ κ²½μ° λ°λμ μ°κ²°λ λ±λμ λΆλΉμ΄ μΌμ ΈμΌν¨
hasOnlyOneConnect(){
return this.connects.size === 1;
}
//μ κ±°ν μ μλ λ±λλ₯Ό λ°ννλ ν¨μ
//μ°κ²°λ λ±λκ° 1κ°μΈ κ²½μ°, μ°κ²°λ λ±λμ λͺ¨λ μ°κ²°μ ν΄μ μν€κ³ λͺ¨λ μ°κ²°μ΄ ν΄μ λ λ±λμ λͺ©λ‘λ₯Ό λ°ν
getRemovalTargets(){
//λͺ¨λ μ°κ²°μ΄ ν΄μ λμ΄ μ κ±°λ λ±λλ₯Ό λ΄λ λ°°μ΄
//(== λΆλΉμ΄ μΌμ§ νμκ° μλ λ±λλ₯Ό λ΄λ λ°°μ΄)
const removed = [];
//μμ μκ² μ°κ²°λ λ±λκ° 1κ°μΈ κ²½μ°
if(this.hasOnlyOneConnect()){
//μμ κ³Ό μ°κ²°λ λ±λ (== λΆλΉμ΄ μΌμ§ λ±λ)
const connect = this.connects.values().next().value;
//μμ κ³Ό μ°κ²°λ λ±λμ λͺ¨λ μ°κ²°μ ν΄μ μν€κ³ , λͺ¨λ μ°κ²°μ΄ ν΄μ λ λ±λλ₯Ό μ κ±° λͺ©λ‘μ μΆκ°
//(== μμ κ³Ό μ°κ²°λ λ±λμ λΆλΉμ μΌκ³ , λΆλΉμ΄ μΌμ§ νμκ° μλ λ±λλ₯Ό μ κ±° λͺ©λ‘μ μΆκ°)
connect.connects.forEach(el => el.disconnect(connect) && removed.push(el));
//μμ κ³Ό μ°κ²°λ λ±λλ μ κ±° λͺ©λ‘μ μΆκ°
//(== λΆλΉμ΄ μΌμ§ λ±λλ μ κ±° λͺ©λ‘μ μΆκ°)
removed.push(connect);
}
//μ κ±°ν λ±λ λͺ©λ‘μ μ κ±°
return removed;
}
λ§μ§λ§μΌλ‘ solution ν¨μμμ λͺ¨λ κΈΈμ΄ λ°νμ§ λκΉμ§ λ°λ³΅νκ³ λ΅μ λ°ννλ μ½λλ₯Ό μμ±ν©λλ€.
let answer = 0;
//λͺ¨λ λ±λκ° μ κ±°λ λ κΉμ§ λ°λ³΅
while (lighthouses.size > 0) {
lighthouses.forEach((lighthouse) => {
const targets = lighthouse.getRemovalTargets();
if (targets.length) {
//μ κ±°ν λ±λκ° μ‘΄μ¬νλ κ²½μ° (== λ±λμ λΆλΉμ΄ μΌμ§ κ²½μ°)
//λΆλΉμ΄ μΌμ§ λ±λμ μλ₯Ό μ¦κ°μν€κ³ μ κ±°ν λ±λλ₯Ό lighthouseμμ μ κ±°
answer++;
targets.forEach((el) => lighthouses.delete(el.id));
}
});
}
//λΆλΉμ΄ μΌμ§ λ±λμ μλ₯Ό λ°ν
return answer;
μ΅μ’ μ½λ
class Lighthouse {
constructor(id) {
this.id = id;
this.connects = new Map();
}
//λ€λ₯Έ λ±λμ μ°κ²°μν€λ ν¨μν¨μ
//λ³ΈμΈκ³Ό λ€λ₯Έ λ±λμ μμμ μλ‘λ₯Ό μΆκ°ν¨
connect(target) {
this.connects.set(target.id, target);
target.connects.set(this.id, this);
}
//λ€λ₯Έ λ±λμ μ°κ²°μ ν΄μ νκ³ , λͺ¨λ μ°κ²°μ΄ ν΄μ λμλ μ§ μ¬λΆλ₯Ό λ°ν
disconnect(target) {
this.connects.delete(target.id);
return this.connects.size === 0;
}
//μ°κ²°λ λ±λμ μκ° 1κ°μΈμ§ νμΈνλ ν¨μ
//μ°κ²°λ λ±λμ μκ° 1κ°μΈ κ²½μ° λ°λμ μ°κ²°λ λ±λμ λΆλΉμ΄ μΌμ ΈμΌν¨
hasOnlyOneConnect() {
return this.connects.size === 1;
}
//μ κ±°ν μ μλ λ±λλ₯Ό λ°ννλ ν¨μ
//μ°κ²°λ λ±λκ° 1κ°μΈ κ²½μ°, μ°κ²°λ λ±λμ λͺ¨λ μ°κ²°μ ν΄μ μν€κ³ λͺ¨λ μ°κ²°μ΄ ν΄μ λ λ±λμ λͺ©λ‘λ₯Ό λ°ν
getRemovalTargets() {
//λͺ¨λ μ°κ²°μ΄ ν΄μ λμ΄ μ κ±°λ λ±λλ₯Ό λ΄λ λ°°μ΄
//(== λΆλΉμ΄ μΌμ§ νμκ° μλ λ±λλ₯Ό λ΄λ λ°°μ΄)
const removed = [];
//μμ μκ² μ°κ²°λ λ±λκ° 1κ°μΈ κ²½μ°
if (this.hasOnlyOneConnect()) {
//μμ κ³Ό μ°κ²°λ λ±λ (== λΆλΉμ΄ μΌμ§ λ±λ)
const connect = this.connects.values().next().value;
//μμ κ³Ό μ°κ²°λ λ±λμ λͺ¨λ μ°κ²°μ ν΄μ μν€κ³ , λͺ¨λ μ°κ²°μ΄ ν΄μ λ λ±λλ₯Ό μ κ±° λͺ©λ‘μ μΆκ°
//(== μμ κ³Ό μ°κ²°λ λ±λμ λΆλΉμ μΌκ³ , λΆλΉμ΄ μΌμ§ νμκ° μλ λ±λλ₯Ό μ κ±° λͺ©λ‘μ μΆκ°)
connect.connects.forEach(
el => el.disconnect(connect) && removed.push(el)
);
//μμ κ³Ό μ°κ²°λ λ±λλ μ κ±° λͺ©λ‘μ μΆκ°
//(== λΆλΉμ΄ μΌμ§ λ±λλ μ κ±° λͺ©λ‘μ μΆκ°)
removed.push(connect);
}
//μ κ±°ν λ±λ λͺ©λ‘μ μ κ±°
return removed;
}
}
function solution(n, connects) {
//nκ°μ λ±λ κ°μ²΄κ° λ΄κΈ΄ 2μ°¨μ λ°°μ΄ μμ±
const lighthouses = new Map(
[...Array(n).keys()].map(i => [i + 1, new Lighthouse(i + 1)])
);
//λͺ¨λ λ±λμ μ°κ²° κ΄κ³λ₯Ό μ μ©
connects
.map(([a, b]) => [lighthouses.get(a), lighthouses.get(b)])
.forEach(([a, b]) => a.connect(b));
let answer = 0;
//λͺ¨λ λ±λκ° μ κ±°λ λ κΉμ§ λ°λ³΅
while (lighthouses.size > 0) {
lighthouses.forEach(lighthouse => {
const targets = lighthouse.getRemovalTargets();
if (targets.length) {
//μ κ±°ν λ±λκ° μ‘΄μ¬νλ κ²½μ° (== λ±λμ λΆλΉμ΄ μΌμ§ κ²½μ°)
//λΆλΉμ΄ μΌμ§ λ±λμ μλ₯Ό μ¦κ°μν€κ³ μ κ±°ν λ±λλ₯Ό lighthouseμμ μ κ±°
answer++;
targets.forEach(el => lighthouses.delete(el.id));
}
});
}
//λΆλΉμ΄ μΌμ§ λ±λμ μλ₯Ό λ°ν
return answer;
}
- TODO: μΆν μ½λμ μ€λͺ μ λ€μ μ 리ν μμ μ λλ€. μ½λλ μ€λͺ μ΄ λ무 μ₯ν©νκ² μμ±λ λλμ΄ κ°ν΄μ...