๐Ÿ… ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 133500 : ๋“ฑ๋Œ€ - Javascript

๋ฌธ์ œ ์„ค๋ช…

์ธ์ฒœ ์•ž๋ฐ”๋‹ค์—๋Š” 1๋ถ€ํ„ฐ n๊นŒ์ง€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ง„ ๋“ฑ๋Œ€ n๊ฐœ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋“ฑ๋Œ€์™€ ๋“ฑ๋Œ€ ์‚ฌ์ด๋ฅผ ์˜ค๊ฐ€๋Š” ๋ฑƒ๊ธธ์ด n-1๊ฐœ ์กด์žฌํ•˜์—ฌ, ์–ด๋Š ๋“ฑ๋Œ€์—์„œ ์ถœ๋ฐœํ•ด๋„ ๋‹ค๋ฅธ ๋ชจ๋“  ๋“ฑ๋Œ€๊นŒ์ง€ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“ฑ๋Œ€ ๊ด€๋ฆฌ์ž ์œค์„ฑ์ด๋Š” ์ „๋ ฅ์„ ์•„๋ผ๊ธฐ ์œ„ํ•˜์—ฌ, ์ด ์ค‘ ๋ช‡ ๊ฐœ์˜ ๋“ฑ๋Œ€๋งŒ ์ผœ ๋‘๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋“ฑ๋Œ€๋ฅผ ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ๊บผ๋ฒ„๋ฆฌ๋ฉด, ๋ฑƒ๊ธธ์„ ์˜ค๊ฐ€๋Š” ๋ฐฐ๋“ค์ด ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฑƒ๊ธธ์˜ ์–‘์ชฝ ๋ ๋“ฑ๋Œ€ ์ค‘ ์ ์–ด๋„ ํ•˜๋‚˜๋Š” ์ผœ์ ธ ์žˆ๋„๋ก ๋“ฑ๋Œ€๋ฅผ ์ผœ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋“ฑ๋Œ€ 8๊ฐœ์™€ 7๊ฐœ์˜ ๋ฑƒ๊ธธ๋“ค์ด ์žˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. ์ด ๊ฒฝ์šฐ 1๋ฒˆ ๋“ฑ๋Œ€์™€ 5๋ฒˆ ๋“ฑ๋Œ€ ๋‘ ๊ฐœ๋งŒ ์ผœ ๋‘์–ด๋„ ๋ชจ๋“  ๋ฑƒ๊ธธ์€ ์–‘์ชฝ ๋ ๋“ฑ๋Œ€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ผœ์ ธ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐฐ๋“ค์€ ์•ˆ์ „ํ•˜๊ฒŒ ์šดํ•ญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

example img

๋“ฑ๋Œ€์˜ ๊ฐœ์ˆ˜ n๊ณผ ๊ฐ ๋ฑƒ๊ธธ์ด ์—ฐ๊ฒฐ๋œ ๋“ฑ๋Œ€์˜ ๋ฒˆํ˜ธ๋ฅผ ๋‹ด์€ ์ด์ฐจ์› ๋ฐฐ์—ด lighthouse๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์œค์„ฑ์ด๊ฐ€ ์ผœ ๋‘์–ด์•ผ ํ•˜๋Š” ๋“ฑ๋Œ€ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.


์ œํ•œ์‚ฌํ•ญ

  • 2 โ‰ค n โ‰ค 100,000
  • lighthouse์˜ ๊ธธ์ด = n โ€“ 1
    • lighthouse ๋ฐฐ์—ด์˜ ๊ฐ ํ–‰ [a, b]๋Š” a๋ฒˆ ๋“ฑ๋Œ€์™€ b๋ฒˆ ๋“ฑ๋Œ€๊ฐ€ ๋ฑƒ๊ธธ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
      • 1 โ‰ค a โ‰  b โ‰ค n
      • ๋ชจ๋“  ๋“ฑ๋Œ€๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋“ฑ๋Œ€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฑƒ๊ธธ์ด ์กด์žฌํ•˜๋„๋ก ์ž…๋ ฅ์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

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๊ฐœ๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. example img


ํ’€์ด ๊ณผ์ •

๋จผ์ € ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ํŒŒ์•…ํ•ด๋ด…์‹œ๋‹ค.

  • ์กฐ๊ฑด 1. lighthouse์˜ ๊ธธ์ด = n โ€“ 1
    ๋“ฑ๋Œ€ ์‚ฌ์ด์˜ ๊ธธ์˜ ์ˆ˜๊ฐ€ ๋“ฑ๋Œ€์˜ ์ˆ˜ -1์ด๋ผ๋Š” ์ด ์กฐ๊ฑด์€ ๋“ฑ๋Œ€์˜ ์ˆ˜์™€ ๊ธธ์˜ ์ˆ˜๊ฐ€ ๋™์ผํ•œ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฑƒ๊ธธ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

    description img

  • ์กฐ๊ฑด 2. ๋ชจ๋“  ๋“ฑ๋Œ€๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋“ฑ๋Œ€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฑƒ๊ธธ์ด ์กด์žฌํ•˜๋„๋ก ์ž…๋ ฅ์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
    ๋ชจ๋“  ๋“ฑ๋Œ€๋Š” ๋‹ค๋ฅธ ๋“ฑ๋Œ€์™€ ๊ธธ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ผ๋Š” ์ด ์กฐ๊ฑด์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฑƒ๊ธธ์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

    description img


์œ„ ๋‘๊ฐ€์ง€ ์กฐ๊ฑด์„ ํ†ตํ•ด ๋ฑƒ๊ธธ์—๋Š” ํ•ญ์ƒ ๋์— ์œ„์น˜ํ•œ ๋“ฑ๋Œ€๊ฐ€ ์กด์žฌํ•˜๊ณ , ๋ชจ๋“  ๋“ฑ๋Œ€๋Š” 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: ์ถ”ํ›„ ์ฝ”๋“œ์™€ ์„ค๋ช…์„ ๋‹ค์‹œ ์ •๋ฆฌํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ž‘ ์„ค๋ช…์ด ๋„ˆ๋ฌด ์žฅํ™ฉํ•˜๊ฒŒ ์ž‘์„ฑ๋œ ๋Š๋‚Œ์ด ๊ฐ•ํ•ด์„œโ€ฆ