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

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

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv.1] ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ ์˜๋‹จ์–ด

ํ’€์ด ๋‚ ์งœ : 2025.04.28
๋ฌธ์ œ ์œ ํ˜• : 2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ
๋ฌธ์ œ ์ œ๋ชฉ : ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ ์˜๋‹จ์–ด
๋ฌธ์ œ ๋งํฌ : https://school.programmers.co.kr/learn/courses/30/lessons/81301

Intuition

  • ๋ฌธ์ž์—ด s ์•ˆ์— ์˜๋‹จ์–ด๋กœ ํ‘œํ˜„๋œ ์ˆซ์ž๋ฅผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
  • ์˜์–ด์™€ ์ˆซ์ž๋ฅผ ๋งคํ•‘ํ•˜์—ฌ s๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ •๋‹ต์„ ๋„์ถœํ•œ๋‹ค.

Approach

  • ์ •๋‹ต์„ ์ €์žฅํ•  ๋ณ€์ˆ˜ answer๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ฐ์ฒด(numbers)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜๋‹จ์–ด์™€ ์ˆซ์ž๋ฅผ ๋งคํ•‘ํ•œ๋‹ค.
  • s๋ฅผ ์ˆœํšŒํ•˜๋Š” for ๋ฃจํ”„ ์•ˆ์—์„œ
    • ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ž๋ผ๋ฉด ๋ณ€์ˆ˜ text์— ๋ˆ„์ ํ•œ๋‹ค.
    • ์ˆซ์ž๋ผ๋ฉด answer์— ๊ทธ๋Œ€๋กœ ๋ˆ„์ ํ•œ๋‹ค.
    • ๋ˆ„์ ๋œ text๊ฐ€ numbers์— ์ง€์ •๋œ ๋‹จ์–ด๋ผ๋ฉด ์ด์— ํ•ด๋‹นํ•˜๋Š” ์ˆซ์ž ๋ฌธ์ž์—ด์„ answer์— ๋ˆ„์ ํ•œ๋‹ค.
  • answer๋ฅผ number๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Complexity

  • Time complexity : O(n)
    • ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด๋ฅผ n์ด๋ผ๊ณ  ํ•  ๋•Œ for ๋ฃจํ”„์—์„œ s ์ „์ฒด๋ฅผ ์ˆœํšŒํ•œ๋‹ค.
    • for ๋ฃจํ”„ ๋‚ด ๋ชจ๋“  ์ž‘์—…์€ O(1)์ด๋ฏ€๋กœ ์ „์ฒด์ ์œผ๋กœ O(n)์ด๋‹ค.
  • Splace complexity : O(n)
    • numbers์˜ ํฌ๊ธฐ๋Š” 10์œผ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ O(1)์ด๋‹ค.
    • answer์˜ ํฌ๊ธฐ๋Š” s์˜ ๊ธธ์ด์— ๋น„๋ก€ํ•˜๋ฏ€๋กœ O(n)์ด๊ณ , ์ „์ฒด์ ์œผ๋กœ O(n)์ด๋‹ค.

Code (JS)

  • ๋ฌธ์ œ์ 
    • ๋งค ๋ฌธ์ž๋งˆ๋‹ค number๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  isNaN์„ ํ˜ธ์ถœํ•˜๋Š” ๊ณผ์ •์ด ๋น„ํšจ์œจ์ ์ด๋‹ค. numbers๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ”๊ฟ”์„œ ์ธ๋ฑ์Šค์™€ ๋ฌธ์ž์—ด์„ ๋งคํ•‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • ์ •๊ทœํ‘œํ˜„์‹(replace)์„ ์ด์šฉํ•˜๋ฉด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€ ์ˆ˜๋„ ์žˆ๋‹ค.
function solution(s) {
    let answer = '';
    const numbers = {
        'zero': '0',
        'one': '1',
        'two': '2',
        'three': '3',
        'four': '4',
        'five': '5',
        'six': '6',
        'seven': '7',
        'eight': '8',
        'nine': '9',
    }

    let text = '';

    for (let i = 0; i < s.length; i++) {
        let isString = isNaN(Number(s[i]));

        if (isString) {
            text += s[i];
        } else {
            answer += s[i];
        }
        if (numbers[text]) {
            answer += numbers[text];
            text = '';
        }
    }
    return Number(answer);
}
  • ์ตœ์ ํ™”ํ•œ ์ฝ”๋“œ 1 : ์ •๊ทœํ‘œํ˜„์‹ ์‚ฌ์šฉ
function solution(s) {
    const numbers = {
        'zero': '0',
        'one': '1',
        'two': '2',
        'three': '3',
        'four': '4',
        'five': '5',
        'six': '6',
        'seven': '7',
        'eight': '8',
        'nine': '9',
    };

    for (const [word, digit] of Object.entries(numbers)) {
        s = s.replaceAll(word, digit);
    }
    return +s;
}
  • ์ตœ์ ํ™”ํ•œ ์ฝ”๋“œ 2 : ๋ฐฐ์—ด ์‚ฌ์šฉ
function solution(s) {
    const numbers = ['zero','one','two','three','four','five','six','seven','eight','nine'];
    numbers.forEach((word, idx) => {
        s = s.split(word).join(idx);
    });
    return +s;
}