๐Ÿ“’ Algorithm

[์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ ๋ฌธ์ œ 33] ๊ฐ„๋‹จํ•œ ์œ ๋‹ˆ์˜จ-ํŒŒ์ธ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

s2ylvia 2024. 9. 11. 18:49

๋ฌธ์ œ ์„ค๋ช…

์ƒํ˜ธ๋ฐฐํƒ€์  ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋‹ค์Œ ๋‘ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • union(x,y) : x์™€ y๊ฐ€ ์†ํ•œ ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์นฉ๋‹ˆ๋‹ค.
  • find(x,y) : x๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ ์›์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

operations๋ผ๋Š” ๋ฐฐ์—ด์€ ์ˆ˜ํ–‰ํ•  ์—ฐ์‚ฐ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์—ฐ์‚ฐ ์ข…๋ฅ˜๋Š” 2๊ฐœ์ž…๋‹ˆ๋‹ค.

  • ['u',1,2]๋Š” ๋…ธ๋“œ 1๊ณผ ๋…ธ๋“œ 2์— ๋Œ€ํ•ด union ์—ฐ์‚ฐ ์ˆ˜ํ–‰
  • ['f',3]๋Š” ๋…ธ๋“œ 3์˜ ๋ฃจํŠธ ๋…ธ๋“œ ์ฐพ๊ธฐ, find ์—ฐ์‚ฐ ์ˆ˜ํ–‰

์ดˆ๊ธฐ์˜ ๋…ธ๋“œ๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ ์ง‘ํ•ฉ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์ž‘์€ ๋…ธ๋“œ๋ฅผ ๋” ํฐ ๋…ธ๋“œ์˜ ์ž์‹์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. operations์— ์žˆ๋Š” ์—ฐ์‚ฐ์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•œ ํ›„ ์ง‘ํ•ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” solution() ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.

 

์ œ์•ฝ ์กฐ๊ฑด

  • 0 <= k <= 1000 : ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
  • 1 <= operations <= 100000
  • operations[i][0]์€ ๋ฌธ์ž์—ด 'u' ๋˜๋Š” 'f' ์ค‘ ํ•˜๋‚˜
  • 'u'๋Š” union ์—ฐ์‚ฐ, union ์—ฐ์‚ฐ ๋’ค๋กœ๋Š” ๋‘ ๊ฐœ์˜ ์ •์ˆ˜ x,y๊ฐ€ ๋‚˜์˜ด
  • 'f'๋Š” find ์—ฐ์‚ฐ, find ์—ฐ์‚ฐ ๋’ค๋กœ๋Š” ํ•˜๋‚˜์˜ ์ •์ˆ˜ x๊ฐ€ ๋‚˜์˜ด
  • x์™€ y๋Š” 0 ์ด์ƒ k-1 ์ดํ•˜์˜ ์ •์ˆ˜
  • ์—ฐ์‚ฐ์€ ํ•ญ์ƒ ์œ ํšจํ•จ
    • ์ฆ‰, union, find ์—ฐ์‚ฐ์˜ ์ธ์ˆ˜๋Š” ์ƒํ˜ธ๋ฐฐํƒ€์  ์ง‘ํ•ฉ ๋‚ด์— ์žˆ๋Š” ๋…ธ๋“œ ๋ฒˆํ˜ธ

์ž…์ถœ๋ ฅ์˜ ์˜ˆ

k operations result
3 [['u', 0, 1], ['u',1, 2],['f', 2] 1
4 [['u', 0, 1], ['u',2, 3],['f', 0] 2

 

์ •๋‹ต

const find = (parents, x) => {
    //๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ
    if(parents[x] === x){
	//parents[x]๊ฐ€ x์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋‹ˆ๊น ๊ฐ™์œผ๋ฉด ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์€๊ฑฐ๋‹ˆ๊น
	return x;
    }
    
    parents[x] = find(parents, parents[x]); //๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์˜...
    //์žฌ๊ท€๋กœ ์ฐพ์•„๋‚ธ๋‹ค
    return parents[x];
}

const union = (parents, x, y) = {
    //ํ•ฉ์น˜๋Š”๊ฑฐ => ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๊ฐ™๊ฒŒ ํ•˜๋Š”๊ฒƒ
    //์šฐ์„  ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ณ  ํ•ฉ์น˜๋ฉด ๋œ๋‹ค
    const root1 = find(parents, x);
    const root2 = find(parents, y);
    
    parents[root2] = root1; //x๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ž‘ ๊ฐ™๊ฒŒ ํ•˜๋Š”๊ฑฐ๋‹ˆ๊น y๊ฐ€ x์— ๋ถ™์Œ
}


const solution = (k, operations) => {
    //์ž๊ธฐ๋ฅผ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์ดˆ๊ธฐํ™”
    //[0,1,2]
    const parents = Array.from({length: k}, (_,i) => i);
    let n = k; //์ง‘ํ•ฉ์˜ ๊ฐœ์ˆ˜, ์ง€๊ธˆ์€ ๋‹ค ๋‹ค๋ฅธ ์ง‘ํ•ฉ์ด๋‹ˆ๊น(๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅด๋‹ˆ๊น) k๊ฐœ
    
    for(const op of operations){
    	if(op[0] === 'u'){
        	union(parents, op[1], op[2]);
        }else if(op[1] === 'f'){
        	find(parents, op[1]);
        }
    }
    
    //๋ฃจํŠธ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๊ณง ์ง‘ํ•ฉ์˜ ๊ฐฏ์ˆ˜
    n = new Set(Array.from({length: k}, (_,i) => find(parents,i))).size;
    
    return n;
}