๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด/Programmers - Lv.1

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv.1] ํ‘ธ๋“œ ํŒŒ์ดํŠธ ๋Œ€ํšŒ

ํ’€์ด ๋‚ ์งœ : 2025.05.01
๋ฌธ์ œ ์œ ํ˜• : ์—ฐ์Šต๋ฌธ์ œ
๋ฌธ์ œ ์ œ๋ชฉ : ํ‘ธ๋“œ ํŒŒ์ดํŠธ ๋Œ€ํšŒ
๋ฌธ์ œ ๋งํฌ : https://school.programmers.co.kr/learn/courses/30/lessons/134240

Intuition

  • ์Œ์‹์˜ ๊ฐœ์ˆ˜๋ฅผ ์ขŒ์šฐ ๋Œ€์นญ์œผ๋กœ ํ•˜์—ฌ ๊ฐ€์šด๋ฐ '0'์„ ๋‘๊ณ  ์Œ์‹ ๋ฐฐ์น˜๋ฅผ ์™„์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
    • ์ฃผ์–ด์ง„ ๋ฐฐ์—ด(food)์˜ ์ธ๋ฑ์Šค๊ฐ€ ์Œ์‹์˜ ๋ฒˆํ˜ธ, ๊ฐ’์€ ์Œ์‹์˜ ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • ์Œ์‹์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋‘ ์„ ์ˆ˜๊ฐ€ ๋‚˜๋ˆ ๋จน์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ œ์™ธํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ฌธ์ž์—ด ์กฐ์ž‘ ๋ฌธ์ œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Approach

  • 0์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์— ๋ฐฐ์น˜ํ•  ๋ฌธ์ž์—ด์„ ๋ˆ„์ ํ•  ๋ณ€์ˆ˜(left)๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  • food๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ left๋ฅผ ๋งŒ๋“ ๋‹ค.
    • ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋Š” ํ•ญ์ƒ 1์ด๋ฏ€๋กœ ์ œ์™ธํ•˜๊ณ , ์Œ์‹์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋„˜์–ด๊ฐ„๋‹ค.
    • ๋‚˜๋ˆ ์ค˜์•ผํ•  ์Œ์‹์˜ ์ˆ˜(serving) ๋งŒํผ ํ˜„์žฌ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ left์— ๋ˆ„์ ํ•œ๋‹ค.
  • left์— ‘0’๊ณผ left๋ฅผ ๋’ค์ง‘์€ ๊ฐ’์„ ๋ถ™์—ฌ์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Complexity

  • Time complexity : O(n)
    • food์˜ ๊ธธ์ด๋ฅผ n ์ด๋ผ๊ณ  ํ•  ๋•Œ, forEach → O(n)
  • Splace complexity : O(m)
    • left์˜ ๊ธธ์ด๋ฅผ m์ด๋ผ๊ณ  ํ•  ๋•Œ left์™€ left๋ฅผ split, reverse ํ•  ๋•Œ m๋งŒํผ์˜ ์ถ”๊ฐ€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.
    • ์ข…ํ•ฉ์ ์œผ๋กœ๋Š” O(m)์ด๋‹ค.

Code (JS)

  • ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํฌ์ธํŠธ
    • ๋ฌธ์ž์—ด์€ ๋ถˆ๋ณ€(immutable)์ด์–ด์„œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜์–ด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.
    • ๋˜ํ•œ, ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•  ๋•Œ ์–ด์ฐจํ”ผ split ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฐ์—ด๋กœ ํ•œ ๋ฒˆ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ •์ด ์žˆ๋‹ค.
function solution(food) {
    let left = '';

    food.forEach((count, i) => {
        if (i === 0 || count < 2) {
            return;
        }
        const serving = Math.floor(count / 2);
        left += i.toString().repeat(serving);
    })

    return left + '0' + left.split('').reverse().join('');
}
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”ํ•œ ์ฝ”๋“œ
function solution(food) {
    const left = [];

    food.forEach((count, i) => {
        if (i === 0 || count < 2) {
            return;
        }
        
        const serving = Math.floor(count / 2);
        left.push(...Array(serving).fill(+i));
    });

    return left.join('') + '0' + left.reverse().join('');
}