๐Ÿงก๋ฌธ์ œ ์„ค๋ช…

์ค€ํ˜ธ๋Š” ์š”์ฆ˜ ๋””ํŽœ์Šค ๊ฒŒ์ž„์— ํ‘น ๋น ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋””ํŽœ์Šค ๊ฒŒ์ž„์€ ์ค€ํ˜ธ๊ฐ€ ๋ณด์œ ํ•œ ๋ณ‘์‚ฌ n๋ช…์œผ๋กœ ์—ฐ์†๋˜๋Š” ์ ์˜ ๊ณต๊ฒฉ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ง‰๋Š” ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ๋””ํŽœ์Šค ๊ฒŒ์ž„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

์ค€ํ˜ธ๋Š” ์ฒ˜์Œ์— ๋ณ‘์‚ฌ n๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋งค ๋ผ์šด๋“œ๋งˆ๋‹ค enemy[i]๋งˆ๋ฆฌ์˜ ์ ์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.
๋‚จ์€ ๋ณ‘์‚ฌ ์ค‘ enemy[i]๋ช… ๋งŒํผ ์†Œ๋ชจํ•˜์—ฌ enemy[i]๋งˆ๋ฆฌ์˜ ์ ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋‚จ์€ ๋ณ‘์‚ฌ๊ฐ€ 7๋ช…์ด๊ณ , ์ ์˜ ์ˆ˜๊ฐ€ 2๋งˆ๋ฆฌ์ธ ๊ฒฝ์šฐ, ํ˜„์žฌ ๋ผ์šด๋“œ๋ฅผ ๋ง‰์œผ๋ฉด 7 - 2 = 5๋ช…์˜ ๋ณ‘์‚ฌ๊ฐ€ ๋‚จ์Šต๋‹ˆ๋‹ค.
๋‚จ์€ ๋ณ‘์‚ฌ์˜ ์ˆ˜๋ณด๋‹ค ํ˜„์žฌ ๋ผ์šด๋“œ์˜ ์ ์˜ ์ˆ˜๊ฐ€ ๋” ๋งŽ์œผ๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
๊ฒŒ์ž„์—๋Š” ๋ฌด์ ๊ถŒ์ด๋ผ๋Š” ์Šคํ‚ฌ์ด ์žˆ์œผ๋ฉฐ, ๋ฌด์ ๊ถŒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ‘์‚ฌ์˜ ์†Œ๋ชจ์—†์ด ํ•œ ๋ผ์šด๋“œ์˜ ๊ณต๊ฒฉ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌด์ ๊ถŒ์€ ์ตœ๋Œ€ k๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ค€ํ˜ธ๋Š” ๋ฌด์ ๊ถŒ์„ ์ ์ ˆํ•œ ์‹œ๊ธฐ์— ์‚ฌ์šฉํ•˜์—ฌ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ผ์šด๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ค€ํ˜ธ๊ฐ€ ์ฒ˜์Œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณ‘์‚ฌ์˜ ์ˆ˜ n, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฌด์ ๊ถŒ์˜ ํšŸ์ˆ˜ k, ๋งค ๋ผ์šด๋“œ๋งˆ๋‹ค ๊ณต๊ฒฉํ•ด์˜ค๋Š” ์ ์˜ ์ˆ˜๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋‹ด๊ธด ์ •์ˆ˜ ๋ฐฐ์—ด enemy๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ค€ํ˜ธ๊ฐ€ ๋ช‡ ๋ผ์šด๋“œ๊นŒ์ง€ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.


๐Ÿ’›์ œํ•œ์‚ฌํ•ญ

  • 1 โ‰ค n โ‰ค 1,000,000,000
  • 1 โ‰ค k โ‰ค 500,000
  • 1 โ‰ค enemy์˜ ๊ธธ์ด โ‰ค 1,000,000
  • 1 โ‰ค enemy[i] โ‰ค 1,000,000
  • enemy[i]์—๋Š” i + 1 ๋ผ์šด๋“œ์—์„œ ๊ณต๊ฒฉํ•ด์˜ค๋Š” ์ ์˜ ์ˆ˜๊ฐ€ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋ผ์šด๋“œ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” enemy[i]์˜ ๊ธธ์ด๋ฅผ return ํ•ด์ฃผ์„ธ์š”.

๐Ÿ’š์ž…์ถœ๋ ฅ ์˜ˆ

nkenemyresult
73[4, 2, 4, 5, 3, 3, 1]5
24[3, 3, 3, 3]4

๐Ÿ’™์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ#1

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

์ž…์ถœ๋ ฅ ์˜ˆ#2

  • ์ค€ํ˜ธ๋Š” ๋ชจ๋“  ๊ณต๊ฒฉ์— ๋ฌด์ ๊ถŒ์„ ์‚ฌ์šฉํ•˜์—ฌ 4๋ผ์šด๋“œ๊นŒ์ง€ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’œ๋‚˜์˜ ํ’€์ด

์ฒ˜์Œ ๋‚˜์˜ ํ’€์ด๋Š” ์ด๋Ÿฌํ•œ ๋Š๋‚Œ์ด์˜€๋‹ค

ํšจ์œจ์„ฑ ๋ฌธ์ œ๋„ ๊ทธ๋ ‡๊ณ  ํ’€์ด ์ž์ฒด๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š”๊ฑธ ๊นจ๋‹ซ๊ณ  ์ฐธ๊ณ ํ• ๋งŒํ•œ ๋ฌธ์„œ๋ฅผ ์ฐพ๊ธฐ ์‹œ์ž‘ํ–ˆ์Œ

function solution(n, k, enemy) {
    let result = 0
    const sortedEnemy = enemy.sort((a,b) => b-a).slice(0,k).sort((a,b) => a-b)
    for(let i = 0 ; i < enemy.length ; i ++) {
        // ๋ฌด์ ๊ถŒ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด
        const useNoDie = sortedEnemy.indexOf(enemy[i])
        if(useNoDie > -1) {
            sortedEnemy.splice(useNoDie,1)
            k--
        // ์ด๋ฒˆ ๋ณ‘์‚ฌ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š” ๋ณ‘๋ ฅ์ด๋‚˜ ๋ฌด์ ๊ถŒ์ด ์žˆ๋‹ค๋ฉด
        } else if(n >= enemy[i]) {
            n-=enemy[i]
        } else if(k > 0) {
            k--
        } else {
            break
        }
        result++
    }
    // ๋ชจ๋“  ๋ผ์šด๋“œ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด
    if(result === enemy.length) {
        return enemy.length
    }
    return result
}

์ด ๋ฌธ์ œ๋Š” ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผํ•œ๋‹ค. ์•„๋‹ˆ๋ฉด ํ๋ฅผ ์‚ฌ์šฉํ•œ ์ž‘์—…์„ ํ•ด์•ผํ•˜๋Š”๋ฐ ๋‚œ ์ด๋ถ„ํƒ์ƒ‰ํ’€์ด๋ฒ•์ด ์กฐ๊ธˆ ๋” ๋งž๋Š” ๊ฒƒ ๊ฐ™์Œ

function solution(n, k, enemy) {
    // ์ด๋ถ„ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ left, mid, right ๋ณ€์ˆ˜ ์„ ์–ธ
    let [left, right] = [0, enemy.length]
    let mid = Math.floor((left+right)/2)
    while(left <= right) {
        // ํ•ด๋‹น ํƒ์ƒ‰์—์„œ ์‚ฌ์šฉ๋  ๊ธธ์ด ๋‚ด๋ฆผ์ฐจ ์ˆœ(k ์†Œ์ง„์„ ์œ„ํ•จ)
        const curSlice = enemy.slice(0, mid).sort((a,b) => b-a)
        let noDie = k
        // ์ „์Ÿ ํ›„ ๋‚จ์„ ์ƒ๋Œ€ ๋ณ‘์‚ฌ์˜ ์ˆ˜
        const curEnemy = curSlice.reduce((acc, cur) => {
            // ๋ฌด์ ๊ถŒ์ด ์žˆ๋‹ค๋ฉด
            if(noDie > 0) {
                noDie--
                return acc
            }
            return acc+cur
        }, 0)
        // ์ƒ๋Œ€ ๋ณ‘์‚ฌ๋ฅผ ๋ฌด์ ๊ถŒ ํ•œ๋„ ๋‚ด์— ๋ชจ๋‘ ๋ฌด์ฐŒ๋ฅผ ์ˆ˜ ์žˆ๋Š”๊ฐ€?
        if(n-curEnemy >= 0 && noDie >= 0) {
            left = mid + 1
        } else {
            right = mid - 1
        }
        mid = Math.floor((left+right)/2)
    }
    return left-1
}
profile
๋‚ด ์ง€์‹์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋‹ดํ•จ

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