문제주소 : https://programmers.co.kr/learn/courses/30/lessons/81301?language=javascript#
<문제 설명>
문제 설명
네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
- 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
'Programmers' 카테고리의 다른 글
[프로그래머스] 표 편집 / Javascript (0) | 2021.09.02 |
---|---|
[프로그래머스] 거리두기 확인하기 / Javascript (0) | 2021.09.01 |
[프로그래머스] 퍼즐 조각 채우기 / Javascript (2) | 2021.09.01 |
[프로그래머스] 부족한 금액 계산하기 / Javascript (0) | 2021.08.29 |
[프로그래머스] 2개 이하로 다른 비트 / JavaScript (0) | 2021.05.20 |