프로그래머스 | 숫자 문자열과 영단어

chaen·2025년 6월 20일
post-thumbnail

🔗 문제 링크

📌 문제

다음과 같은 문자열 s가 주어졌을 때, 문자열에 숫자 단어가 포함되어 있다면 이를 실제 숫자로 변환하여 정수 형태로 반환해야 합니다.

예시 입력/출력

s = "one4seveneight"    → 1478
s = "23four5six7"        → 234567
s = "2three45sixseven"   → 234567

💻 solution 1: 문자 누적 방식

function solution(s) {
  const wordToNum = {
    zero: 0, one: 1, two: 2, three: 3, four: 4,
    five: 5, six: 6, seven: 7, eight: 8, nine: 9,
  };

  let letter = '';
  let answer = '';

  for (let i = 0; i < s.length; i++) {
    if (!isNaN(s[i])) {
      answer += s[i];
      continue;
    } // 숫자일 경우 바로 answer에 추가

    letter += s[i]; // 문자일 경우 letter에 추가
    if (wordToNum.hasOwnProperty(letter)) {
      // 단어가 완성되었을 경우 answer에 추가한 후 초기화
      answer += wordToNum[letter];
      letter = '';
    }
  }

  return Number(answer);
}
  • 문자열을 한 글자씩 순회하며, 알파벳은 letter 변수에 누적합니다.
  • letter가 숫자 단어("one", "seven" 등)로 완성되면 숫자로 치환하여 answer에 추가합니다.
  • 숫자(0~9)는 그대로 answer에 누적합니다.

장단점

  • ✅ 숫자 단어가 중간에 섞여 있어도 정확하게 인식 가능
  • ✅ 메모리 사용이 적고 성능도 우수
  • ❌ 누적 문자열 처리 로직이 다소 복잡하여 구현 난이도가 있음

💻 solution 2: split-join

function solution(s) {
  let numbers = ["zero", "one", "two", "three", "four",
                 "five", "six", "seven", "eight", "nine"];
  let answer = s;

  for (let i = 0; i < numbers.length; i++) {
    let arr = answer.split(numbers[i]);
    answer = arr.join(i);
  }

  return Number(answer);
}
  • "zero" ~ "nine"까지 모든 숫자 단어에 대해 split()으로 문자열을 분리하고, 해당 숫자로 join()합니다.
  • 이 작업을 0부터 9까지 반복하여 전체 문자열을 숫자로 치환합니다.

📌 작동 예시

s = "one4seveneight"

  1. i = 0, "zero": 없음 → 그대로
  2. i = 1, "one":
  • answer.split("one") → ["", "4seveneight"]
  • join(1) → "14seveneight"
  1. i = 7, "seven":
  • answer = "14seveneight"
  • split("seven") → ["14", "eight"]
  • join(7) → "147eight"
  1. i = 8, "eight":
  • split("eight") → ["147", ""]
  • join(8) → "1478"

→ 최종적으로 answer = "1478"

장단점

  • ✅ 구현이 간단하고 직관적이며 가독성이 높음
  • ✅ 문자열에 숫자 단어가 연속되거나 섞여 있어도 정확히 변환
  • ❌ 전체 문자열을 매 반복마다 탐색하므로 문자열이 매우 긴 경우 성능 저하 우려

방법 비교

방식작동 방식성능가독성/유지보수
문자 누적문자를 한 글자씩 읽으며 누적 후 변환우수비교적 복잡함
split-join전체 문자열을 숫자 단어 기준으로 나눠 치환보통매우 우수

0개의 댓글