[ ๐—ฝ๐—ฟ๐—ผ๐—ด๐—ฟ๐—ฎ๐—บ๐—บ๐—ฒ๐—ฟ๐˜€ ] ์ฒด์œก๋ณต - ๊ทธ๋ฆฌ๋””(Greedy) | JavaScript

NewHaยท2025๋…„ 5์›” 2์ผ
0
post-thumbnail

๐ŸŽฏ ๋ฌธ์ œ ์„ค๋ช…

๐Ÿงฉ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv.1 - ์ฒด์œก๋ณต

์ ์‹ฌ์‹œ๊ฐ„์— ๋„๋‘‘์ด ๋“ค์–ด, ์ผ๋ถ€ ํ•™์ƒ์ด ์ฒด์œก๋ณต์„ ๋„๋‚œ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ ์—ฌ๋ฒŒ ์ฒด์œก๋ณต์ด ์žˆ๋Š” ํ•™์ƒ์ด ์ด๋“ค์—๊ฒŒ ์ฒด์œก๋ณต์„ ๋นŒ๋ ค์ฃผ๋ ค ํ•ฉ๋‹ˆ๋‹ค. ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ๋Š” ์ฒด๊ฒฉ ์ˆœ์œผ๋กœ ๋งค๊ฒจ์ ธ ์žˆ์–ด, ๋ฐ”๋กœ ์•ž๋ฒˆํ˜ธ์˜ ํ•™์ƒ์ด๋‚˜ ๋ฐ”๋กœ ๋’ท๋ฒˆํ˜ธ์˜ ํ•™์ƒ์—๊ฒŒ๋งŒ ์ฒด์œก๋ณต์„ ๋นŒ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 4๋ฒˆ ํ•™์ƒ์€ 3๋ฒˆ ํ•™์ƒ์ด๋‚˜ 5๋ฒˆ ํ•™์ƒ์—๊ฒŒ๋งŒ ์ฒด์œก๋ณต์„ ๋นŒ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒด์œก๋ณต์ด ์—†์œผ๋ฉด ์ˆ˜์—…์„ ๋“ค์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฒด์œก๋ณต์„ ์ ์ ˆํžˆ ๋นŒ๋ ค ์ตœ๋Œ€ํ•œ ๋งŽ์€ ํ•™์ƒ์ด ์ฒด์œก์ˆ˜์—…์„ ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ํ•™์ƒ์˜ ์ˆ˜ n, ์ฒด์œก๋ณต์„ ๋„๋‚œ๋‹นํ•œ ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด lost, ์—ฌ๋ฒŒ์˜ ์ฒด์œก๋ณต์„ ๊ฐ€์ ธ์˜จ ํ•™์ƒ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด reserve๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ฒด์œก์ˆ˜์—…์„ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ํ•™์ƒ์˜ ์ตœ๋Œ“๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

๐Ÿฅ… ์ œํ•œ ์‚ฌํ•ญ

  • ์ „์ฒด ํ•™์ƒ์˜ ์ˆ˜๋Š” 2๋ช… ์ด์ƒ 30๋ช… ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ์ฒด์œก๋ณต์„ ๋„๋‚œ๋‹นํ•œ ํ•™์ƒ์˜ ์ˆ˜๋Š” 1๋ช… ์ด์ƒ n๋ช… ์ดํ•˜์ด๊ณ  ์ค‘๋ณต๋˜๋Š” ๋ฒˆํ˜ธ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๋ฒŒ์˜ ์ฒด์œก๋ณต์„ ๊ฐ€์ ธ์˜จ ํ•™์ƒ์˜ ์ˆ˜๋Š” 1๋ช… ์ด์ƒ n๋ช… ์ดํ•˜์ด๊ณ  ์ค‘๋ณต๋˜๋Š” ๋ฒˆํ˜ธ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๋ฒŒ ์ฒด์œก๋ณต์ด ์žˆ๋Š” ํ•™์ƒ๋งŒ ๋‹ค๋ฅธ ํ•™์ƒ์—๊ฒŒ ์ฒด์œก๋ณต์„ ๋นŒ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๋ฒŒ ์ฒด์œก๋ณต์„ ๊ฐ€์ ธ์˜จ ํ•™์ƒ์ด ์ฒด์œก๋ณต์„ ๋„๋‚œ๋‹นํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์ด ํ•™์ƒ์€ ์ฒด์œก๋ณต์„ ํ•˜๋‚˜๋งŒ ๋„๋‚œ๋‹นํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉฐ, ๋‚จ์€ ์ฒด์œก๋ณต์ด ํ•˜๋‚˜์ด๊ธฐ์— ๋‹ค๋ฅธ ํ•™์ƒ์—๊ฒŒ๋Š” ์ฒด์œก๋ณต์„ ๋นŒ๋ ค์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿ“ ์ž…์ถœ๋ ฅ ์˜ˆ

nlostreservereturn
5[2, 4][1, 3, 5]5
5[2, 4][3]4
3[3][1]2

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๋ฌธ์ œ ํ’€์ด

lost ์™€ reserve ์— ๋‘˜ ๋‹ค ์žˆ๋Š” ๊ฒฝ์šฐ, ์ฆ‰ ์—ฌ๋ฒŒ ์ฒด์œก๋ณต์„ ๊ฐ€์ ธ์˜จ ํ•™์ƒ์ด ๋„๋‚œ์„ ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ณธ์ธ์ด ์ž…์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ฒด์œก๋ณต์„ ๋นŒ๋ ค์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๊ฐ ๋ฐฐ์—ด์—์„œ ํ•ด๋‹น ํ•™์ƒ์„ ์ œ์™ธํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const both = lost.filter(student => reserve.includes(student));
const realLost = lost.filter(student => !both.includes(student));
const realReserve = reserve.filter(student => !both.includes(student));

๊ทธ๋ฆฌ๊ณ  ๋ฒˆํ˜ธ ์ˆœ์„œ๋Œ€๋กœ ์•ž ์‚ฌ๋žŒ์—๊ฒŒ ๋นŒ๋ ค์ค๋‹ˆ๋‹ค. ๋’ค์— ์žˆ๋Š” ํ•™์ƒ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋นŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒŒ ํƒ์š•์  ์„ ํƒ์ž…๋‹ˆ๋‹ค. ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ์ตœ๋Œ€ํ•œ ๋„์™€์ฃผ๋˜, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์•ž ์‚ฌ๋žŒ๋ถ€ํ„ฐ ๋„์™€์ฃผ๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค.

let count = realLost.length;
for(let i = 0; i < realLost.length; i++){
	let idx = realReserve.indexOf(realLost[i] - 1);
	if(idx > -1){
		realReserve.splice(idx, 1)
		count --;
	} else {
		idx = realReserve.indexOf(realLost[i] + 1);
		if(idx > -1){
			realReserve.splice(idx, 1)
			count--;
		} else {
			continue;
		}
	}
}
    
return n - count;

์˜์‚ฌ ์ฝ”๋“œ ๋Œ€๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํ†ต๊ณผ๋Š” ํ•˜์ง€๋งŒ ๋งค๋ฒˆ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๊ณ  splice()๋ฅผ ํ•˜๋Š” ๋กœ์ง์ด ๊ต‰์žฅํžˆ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์ฐพ๊ธฐ(O(n)) x splice๋กœ ์žฌ๋ฐฐ์น˜(O(n))๋ฅผ ํ•˜๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(nยฒ)์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ด๋Ÿด ๋• ํ•ด์‹œํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์‹œํ…Œ์ด๋ธ”์€ ํƒ์ƒ‰๊ณผ ์‚ญ์ œ๊ฐ€ O(1)๋กœ ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์šฐ์„  realReserve๋ฅผ Set์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

const realReserve = new Set(reserve.filter(student => !both.includes(student)));

์ด๋ฅผ ์ด์šฉํ•ด์„œ ํƒ์ƒ‰ํ•˜๊ณ  ์‚ญ์ œํ•ด ์ค๋‹ˆ๋‹ค.

for(let student of realLost) {
	if(realReserve.has(student - 1){
		realReserve.delete(student - 1);
		count--;
	} else if (realReserve.has(student + 1){
		realReserve.delete(student + 1);
		count--;
	}
}

์ตœ์ข… ์ฝ”๋“œ

function solution(n, lost, reserve) {
    const both = lost.filter(student => reserve.includes(student));
    const realLost = lost.filter(student => !both.includes(student)).sort((a, b) => a - b);
    const realReserve = new Set(reserve.filter(student => !both.includes(student)));
    
    let count = realLost.length;
    for(let student of realLost) {
	    if(realReserve.has(student - 1)) {
		    realReserve.delete(student - 1);
		    count--;
	    } else if (realReserve.has(student + 1)){
		    realReserve.delete(student + 1);
		    count--;
	    }
    }
    
    return n - count;
}

โŠ• ๋ง, ์ตœ์  ์„ค๊ณ„ ์ฝ”๋“œ

Map์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ฐ„๋ณต์žก๋„, ๊ณต๊ฐ„๋ณต์žก๋„, ๊ฐ€๋…์„ฑ, ํ™•์žฅ์„ฑ๊นŒ์ง€ ๊ณ ๋ คํ•œ ์ตœ์ ์˜ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค.

ํ•™์ƒ ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ๊ฐ ์ธ๋ฑ์Šค๋ฅผ -1(์žƒ์–ด๋ฒ„๋ฆผ), 1(์—ฌ๋ฒŒ ์žˆ์Œ), 0(๋ฌด๊ด€ํ•œ์ƒํƒœ)๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์ƒํƒœ๋กœ ๋ชจ๋“  ๋กœ์ง์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

function solution(n, lost, reserve) {
		// ํ•™์ƒ๋“ค ๋ฒˆํ˜ธ๊ฐ€ ๊ณง ์ธ๋ฑ์Šค๊ฐ€ ๋˜๋„๋ก ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
		// ์ด ๋•Œ, 1๋ฒˆ ๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด 0๋ฒˆ์„ ์ถ”๊ฐ€ํ•˜๋„๋ก +1,
		// ์ถ”ํ›„ ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋’ท ๋ฒˆํ˜ธ ํ•™์ƒ์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ undefined๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋„๋ก +1 ํ•˜์—ฌ n + 2๋งŒํผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    const student = new Array(n + 2).fill(0);

    // ์—ฌ๋ฒŒ ์ฒด์œก๋ณต์„ ๊ฐ€์ง„ ํ•™์ƒ๋“ค์„ ํ‘œ์‹œํ•ด ์ค๋‹ˆ๋‹ค.
    for (let r of reserve) {
        student[r]++; // 1
    }

    // ๋„๋‚œ ๋‹นํ•œ ํ•™์ƒ๋“ค์„ ํ‘œ์‹œํ•ด ์ค๋‹ˆ๋‹ค.
    for (let l of lost) {
        student[l]--; // -1
    }

    for (let i = 1; i <= n; i++) {
        if (student[i] === -1) {
	        // ๋„๋‚œ ๋‹นํ•œ ํ•™์ƒ์ด๋ผ๋ฉด
            if (student[i - 1] === 1) {
	            // ์•ž๋ฒˆํ˜ธ ํ•™์ƒ์ด ์—ฌ๋ฒŒ์ด ์žˆ๋‹ค๋ฉด ๋นŒ๋ ค์ฃผ๊ณ  -1
	            // ๋นŒ๋ฆฐ ํ•™์ƒ์€ +1ํ•ด์„œ ๋ฌด๊ด€ํ•œ ์ƒํƒœ๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.
                student[i]++;
                student[i - 1]--;
            } else if (student[i + 1] === 1) {
	            // ๋งŒ์•ฝ ์•ž๋ฒˆํ˜ธ ํ•™์ƒ์ด ์—ฌ๋ฒŒ์ด ์—†๊ณ , ๋’ท ๋ฒˆํ˜ธ ํ•™์ƒ์ด ์—ฌ๋ฒŒ์ด ์žˆ๋‹ค๋ฉด 
	            // ๋˜‘๊ฐ™์ด ๋นŒ๋ ค์ฃผ๊ณ  -1, +1 ํ•ด์ค€๋‹ค.
                student[i]++;
                student[i + 1]--;
            }
        }
    }

    // ์ตœ์ข…์ ์œผ๋กœ ๊ฐ’์ด 0์ธ ํ•™์ƒ๋“ค๋งŒ ์„ธ์–ด์ค€๋‹ค.
    return student.slice(1, n + 1).filter(x => x >= 0).length;
}

๋น„๊ตํ•ด๋ณด๋ฉด ํ…Œ์ŠคํŠธ 1์„ ๊ธฐ์ค€์œผ๋กœ 20ms ์—์„œ 0.08ms๋กœ ํฌ๊ฒŒ ์ค„์–ด๋“ค์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

profile
๋ฐฑ ๋ฒˆ์„ ๋ณด๋ฉด ํ•œ ๊ฐ€์ง€๋Š” ์•ˆ๋‹ค ๐Ÿ‘€

0๊ฐœ์˜ ๋Œ“๊ธ€