๐ ํ๋ก๊ทธ๋๋จธ์ค 133500 : ๋ฑ๋ - Javascript
2023-03-14
๋ฌธ์ ์ค๋ช
์ธ์ฒ ์๋ฐ๋ค์๋ 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: ์ถํ ์ฝ๋์ ์ค๋ช ์ ๋ค์ ์ ๋ฆฌํ ์์ ์ ๋๋ค. ์ฝ๋๋ ์ค๋ช ์ด ๋๋ฌด ์ฅํฉํ๊ฒ ์์ฑ๋ ๋๋์ด ๊ฐํด์โฆ