한 걸음씩

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

Programmers

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

winter17 2023. 7. 8. 12:39

https://school.programmers.co.kr/learn/courses/30/lessons/81301

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 과정

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

    const numStr = Object.keys(obj)
    const num = Object.values(obj)
    const arr = s.split('') // 문자열 s를 모두 쪼개서 배열로
    let answer = []
    let rest = ''
    for (let i = 0; i < arr.length; i++){
        if (!isNaN(parseInt(arr[i]))){ // 숫자이면 answer배열에 push 
        // → !isNaN해야 중복된 문자 처리함
            answer.push(arr[i])
        }else{ // 1. 숫자가 아니고
            rest += arr[i] // 2. rest 빈문자열에 arr[i] 요소를 하나씩 더하는데
            if (numStr.includes(rest)){ // 3. key들만 빼서 저장한 배열에 rest가 존재하면
                answer.push(rest) // 4. answer배열에 push
                rest = ''  // rest문자열을 초기화해야 이전의 값이 누적되지 않음
            }
         }
    }
    // 위의 과정까지가 문자로 표현된 숫자들을 분리하는 과정
    
    // 아래의 과정은 문자로 표현된 숫자들을 숫자형으로 바꿔주는 과정
    for (let i = 0; i < answer.length; i++){
        if (answer[i] !== '0' && !parseInt(answer[i])){ // 해당 요소가 '0'이 아니고 문자여야함 
        // → '0'이 나올 경우 undefined 처리하지 않음
            answer.splice(i, 1, obj[answer[i]]) // obj객체에서 key값(answer[i)을 이용해 value에 접근
        }
    }
    return Number(answer.join('')); // answer은 배열이고 문자열이라서 join으로 문자열로 변환 후 숫자로 변환해야한다
}
// console.log(solution("1zerotwozero3")) // 중복된 문자가 나오는 경우
// console.log(solution("one00")) // '0'이 나오는 경우

△ 코드 설명은 주석 참고!

시간제한도 있어서 이중 반복을 하면 시간초과가 발생한다.

마지막에 있는 2개의 테스트 케이스까지 반드시 고려해줘야 한다

 

function solution(s) {
    var answer = 0;
    const arr = ['zero','one','two','three','four','five','six','seven','eight','nine',]
       
    arr.forEach((e, i) => 
               s = s.split(e).join(i)
               )
    return Number(s);
}

리뷰

문제가 너무 까다로웠고 히든 케이스 조건을 맞추는 게 너무 힘들었다.

문제 풀고 다른 사람 풀이 확인했는데 진짜...

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

    for(let i=0; i< numbers.length; i++) {
        let arr = answer.split(numbers[i]); 
        // answer문자열을 numbers[i]를 기준으로 분리하여 arr배열에 저장
        answer = arr.join(i); // arr 배열을 구분자 i값을 사용하여 다시 저장 
    }

    return Number(answer);
}

split과 join을 단순히 배열, 문자열 치환 메서드라고 알고 있다면 위의 코드처럼 절대 풀 수 없다...

split은 () 괄호 안의 어떤것을 기준으로 분리하여 배열로 만들고

join은 () 괄호안의 구분자 어떤 값을 기준으로 문자열로 만든다

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120894

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

▲ 비슷한 유형의 문제