Programmers

[프로그래머스] 숫자 문자열과 영단어 / Javascript

개발하는 사막여우 2021. 9. 1. 21:00
반응형

문제주소 : https://programmers.co.kr/learn/courses/30/lessons/81301?language=javascript# 

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr


<문제 설명>

더보기

문제 설명

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예

sresult
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 #4

  • s에는 영단어로 바뀐 부분이 없습니다.

제한시간 안내

  • 정확성 테스트 : 10초

 

<풀이법>

▒ 한줄 개념: 조건문 분기 ▒ 

조건문 분기를 통해 해결하는 문제입니다. 반복문을 돌며 각 글자를 확인하여 분기에 따라 동작하며, 핵심 로직은 다음과 같습니다.

 

1. 'z', 'o', 'e', 'n'의 경우 무조건 하나의 단어만이 나올 수 있습니다.

z: zero
o: one
e: eight
n: nine

 

2. 't', 'f', 's'의 경우 각 두가지 단어가 나올 수 있습니다.

t: two/three
f: four/five
s: six/seven

 

3. 기본 숫자의 경우, 그대로 사용할 수 있습니다.

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

 

위의 규칙에 따라 단어를 answer에 추가시켜주면서, i 값을 해당 글자 길이만큼 증가시켜, 불필요한 확인을 줄여줍니다.

ex) 'z' -> answer += '0' -> i += 4(zero의 길이 4)

ex) 'e' -> answer += '8' -> i += 5(eight의 길이 5)

ex) '9' -> answer += '9' -> i += 1(숫자 문자 그대로의 길이 1)

<코드(Javascript)>

function solution(s) {
    let answer = '';
    let i = 0;
    
    const numbers = {
        zero: { len: 4, char: '0' },
        one: { len: 3, char: '1' },
        two: { len: 3, char: '2' },
        three: { len: 5, char: '3' },
        four: { len: 4, char: '4' },
        five: { len: 4, char: '5' },
        six: { len: 3, char: '6' },
        seven: { len: 5, char: '7' },
        eight: { len: 5, char: '8' },
        nine: { len: 4, char: '9' },
    }
    
    const update = char => {
        if(numbers[char]){
            answer += numbers[char].char;
            return numbers[char].len;
        }else{
            answer += char;
            return 1;
        }
    }
    
    while(i < s.length){
        const char = s.charAt(i);
        const nextChar = s.charAt(i+1);
        i += char === 'z' ? update('zero') 		// 'z'로 시작할경우 0
            : char === 'o' ? update('one') 		// 'o'로 시작할경우 1
            : char === 't' ? nextChar === 'w'
                ? update('two') 				// 't'로 시작하고 'w'일 경우 2
                : update('three') 				// 't'로 시작하고 'w'가 아닐 경우 3
            : char === 'f' ? nextChar === 'o'
                ? update('four') 				// 'f'로 시작하고 'o'일 경우 4
                : update('five') 				// 'f'로 시작하고 'o'가 아닐 경우 5
            : char === 's' ? nextChar === 'i'
                ? update('six') 				// 's'로 시작하고 'i'일 경우 6
                : update('seven') 				// 's'로 시작하고 'i'가 아닐 경우 7
            : char === 'e' ? update('eight')  	// 'e'로 시작할경우 8
            : char === 'n' ? update('nine') 	// 'n'로 시작할경우 9
            : update(char); 					// 그 외일 경우 숫자 문자
    }
    return Number(answer);
}

 

 

더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest

 

 

반응형