https://school.programmers.co.kr/learn/courses/30/lessons/81301
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

접근 과정
1. 하나의 숫자 영문은 하나의 객체 또는 배열로 바라본다.
2. 숫자는 숫자 그대로 return한다.
3. 하나의 숫자 영문인 객체 또는 배열을 숫자로 바꿔준다.
첫번째 접근
one, two, three, four, ... , nine 까지의 문자열이 담긴 배열을 만들어준다.
또 다른 변수를 선언해 for문을 이용하여 글자를 한 글자씩 담는다. 이때, 숫자일 경우엔 곧바로 answer 변수에 담는다.
한글자씩 담을때 만약 진적에 선언한 배열과 글자가 같다면 이를 숫자로 대칭할 수 있는 변수에 담는다. 이후 숫자로 변환하여 answer 변수에 담고 한글자씩 담던 변수는 초기화한다.
하지만, 로직이 너무 길어져 비효율적임을 직감했다.
두번째 접근
마찬가지로 one, two, three, ... , nine까지 영문(key)을 선언하되 숫자(value)와 짝을 이뤄 객체로 만들었다.
let num = {zero:0, one:1, two:2, three:3, four:4, five:5, six:6, seven:7, eight:8, nine:9};
replace()와 정규표현식을 이용하여 일치하는 문자열을 찾고, 콜백 함수에서 전달받은 매칭 문자열(match)을 매핑 객체를 통해 숫자로 변환하여 치환한 뒤 그 결과를 변수에 저장한다.
let answer_a = s.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g,(match) => {return num[match];})
그런 다음 이를 숫자로 변환하여 return할 변수에 담아준다.
answer = Number(answer_a);
뻗어나가는 생각
만약, 위의 문제처럼 숫자가 10개가 아니라, 1,000개일경우엔? 10,000개 ~ 100,000개일 경우엔?
지금은 단순히 숫자단어가 10개정도이기에 이를 객체로 받아낼 수 있는것이다.
이 경우엔 단어들의 공통점(규칙)을 찾아내야한다.
기본 숫자에는 1~19까지https://school.programmers.co.kr/learn/courses/30/lessons/81301
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

접근 과정
1. 하나의 숫자 영문은 하나의 객체 또는 배열로 바라본다.
2. 숫자는 숫자 그대로 return한다.
3. 하나의 숫자 영문인 객체 또는 배열을 숫자로 바꿔준다.
첫번째 접근
one, two, three, four, ... , nine 까지의 문자열이 담긴 배열을 만들어준다.
또 다른 변수를 선언해 for문을 이용하여 글자를 한 글자씩 담는다. 이때, 숫자일 경우엔 곧바로 answer 변수에 담는다.
한글자씩 담을때 만약 진적에 선언한 배열과 글자가 같다면 이를 숫자로 대칭할 수 있는 변수에 담는다. 이후 숫자로 변환하여 answer 변수에 담고 한글자씩 담던 변수는 초기화한다.
하지만, 로직이 너무 길어져 비효율적임을 직감했다.
두번째 접근
마찬가지로 one, two, three, ... , nine까지 영문(key)을 선언하되 숫자(value)와 짝을 이뤄 객체로 만들었다.
let num = {zero:0, one:1, two:2, three:3, four:4, five:5, six:6, seven:7, eight:8, nine:9};
replace()와 정규표현식을 이용하여 일치하는 문자열을 찾고, 콜백 함수에서 전달받은 매칭 문자열(match)을 매핑 객체를 통해 숫자로 변환하여 치환한 뒤 그 결과를 변수에 저장한다.
let answer_a = s.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g,(match) => {return num[match];})
그런 다음 이를 숫자로 변환하여 return할 변수에 담아준다.
answer = Number(answer_a);
두 접근 방식의 비교
첫번째 접근의 경우
- 문자열을 한글자씩 순회한다.(버퍼에 누적시킨다.)
- 배열과 비교한다. → 숫자로 변환한다.
- 버퍼 초기화
두번째 접근의 경우
- 문자열을 한번 탐색한다.
- 정규표현식과 매칭을 시도한다. → 매칭되면 콜백을 실행
- 치환 문자열을 생성한다.
둘다 시간복잡도 O(n)이다.
하지만 둘의 큰 차이점
복잡한 반복 패턴이 없어 코드 가독성↑
누군가가 봤을때 가독성이 높은 코드가 가장 좋은 코드인점을 받아들여보았을때, 두번째 접근이 더 용이하다고 판단했다.
뻗어나가는 생각
만약, 위의 문제처럼 숫자가 10개가 아니라, 1,000개일경우엔? 10,000개 ~ 100,000개일 경우엔?
지금은 단순히 숫자단어가 10개정도이기에 이를 객체로 받아낼 수 있는것이다.
이 경우엔 단어들의 공통점(규칙)을 찾아내야한다.
- 영문에서 기본 숫자에는 1~19까지가 불규칙적이고 20이상부터는 규칙적이다.
- 10, 20, 30, ... ,90 또한 불규칙적이다.
- 100, 1,000, 10,000 또한 불규칙적이다.
만약 사용자에게 "one hundred twenty three" 라는 문자를 받았을때, 우리는 이를 숫자로 변환해야 한다면 어떻게 접근을 해야할까에 대해서 생각해보았다.
나는 이를 수학적으로 접근해보았다. one = 1 / hundred = 100 / twenty = 20 / three = 3
즉, 1 x 100 + 20 + 3 = 123 이런 과정이 설계가 된다.
이를 코드의 변수로 등록을 한다면, hundred의 경우 100이 들어가되 맨 앞의 숫자가 있다면 그 숫자와 곱해주면 되는것이다.
맨 앞의 숫자는 current로 등록하여 현재 탐색의 위치로 정의한다.
예제가 "one hundred twenty three" 일 경우
- total += current 이 변수는 current가 이동할때마다 변수를 저장한다.
- current = one = 1
- hundred는 숫자보단 식으로 접근한다. X 100
- current = 1 X 100 = 100
- current = twenty = 120
- current = three = 123
- current = null
이런 방식으로 영어 숫자의 계층을 생각해 볼 수 있다.
이는 한국과도 같게 숫자는 하나의 계층 단위를 갖는다는 것을 생각해 볼 수 있었다.
개인적으로 필요 했던 정보
replace()란? 치환함수이다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace
String.prototype.replace() - JavaScript | MDN
developer.mozilla.org
'알고리즘' 카테고리의 다른 글
| [1일 1 알고리즘] D+6 - 배열의 평균값 (0) | 2026.02.21 |
|---|---|
| [1일 1 알고리즘] D+5 - 정수 내림차순으로 배치하기 (0) | 2026.02.19 |
| [1일 1 알고리즘] D+4 - 최빈값 구하기 (0) | 2026.02.17 |
| [1일 1 알고리즘] D+2 - 유클리드 호제법 (0) | 2026.02.14 |
| [1일 1 알고리즘] D+1 - 몫 구하기 (0) | 2026.02.12 |