본문 바로가기
Research/problems

프로그래머스_lv0_영어가 싫어요

by RIEM 2022. 11. 22.

생각
split() 방식
문제의 핵심은 one, two, .. 숫자를 지칭하는 영단어를 숫자로 바꿔라는 것이다. one이 1이 되고 two가 2가 된다.

그러면 우선 one, two 등을 숫자로 짝지어 변환할 수 있도록 객체 데이터 형식으로 미리 만들어둬야겠다.

const dict = {
‘one’ : 1,
‘two’ : 2,
‘three’ : 3,
‘four’ : 4,
‘five’ : 5,
‘six’ : 6,
‘seven’ : 7,
‘eight’ : 8,
‘nine’ : 9,
‘zero’ : 0
}

그 다음 아규먼트로 받아온 numbers를 split()하는데, split하는 기준을 위의 dict의 key로, 즉 one, two 등 숫자를 지칭하는 단어로 지정하면 해당 단어들 기준으로 쪼개질 것이다.

그런데 split 방식으로 접근하면 그 기준 단어 자체를 제외한 나머지 요소들을 리스트로 리턴한다. 우리는 기준 단어를 보존해야 하므로 split() 메소드는 적절하지 않다.

replace() 메소드
단어를 바꿔치기 할 수 있는 메소드가 없을까 하다 찾아보니 replace 메소드가 있다.

console.log('abcdefg'.replace('abc', 'abc,')) //"abc,defg"

replace() 메소드는 특정 패턴이 매칭되는 단어를 바꿔서 새로운 스트링을 반환한다. 여기서 패턴에는 스트링이 될 수도 있지만 정규표현식이 되도 괜찮다고 한다. 

function solution(numbers) {

let answer = numbers
.replace("zero", 0)
.replace("one", 1)
.replace("two", 2)
.replace("three", 3)
.replace("four", 4)
.replace("five", 5)
.replace("six", 6)
.replace("seven", 7)
.replace("eight", 8)
.replace("nine", 9)

return Number(answer)
}

이 방식대로 진행했고 결과값에는 큰 문제가 없어보이는데 에러가 발생한다. 아마도 특정 테스트 조건이 충족되지 않는 듯 하다.

테스트 1 〉 통과 (0.07ms, 33.4MB)
테스트 2 〉 실패 (0.07ms, 33.5MB)
테스트 3 〉 실패 (0.04ms, 33.4MB)
테스트 4 〉 실패 (0.06ms, 33.4MB)
테스트 5 〉 실패 (0.05ms, 33.4MB)
테스트 6 〉 실패 (0.06ms, 33.4MB)
테스트 7 〉 통과 (0.04ms, 33.4MB)
테스트 8 〉 통과 (0.04ms, 33.4MB)
테스트 9 〉 실패 (0.04ms, 33.5MB)


해결1
풀다가 제한시간이 지나서 결국 다른 사람들의 문제 풀이를 보았다. 정규 표현식으로 풀거나 반복문으로 풀었는데, 그중 가장 직관적인 풀이를 참조하여 풀이했다.

​​function solution(numbers) {

let answer = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

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

return Number(numbers)
}


해결2

function solution(numbers) {

    let answer = numbers
    .replaceAll("zero", 0)
    .replaceAll("one", 1)
    .replaceAll("two", 2)
    .replaceAll("three", 3)
    .replaceAll("four", 4)
    .replaceAll("five", 5)
    .replaceAll("six", 6)
    .replaceAll("seven", 7)
    .replaceAll("eight", 8)
    .replaceAll("nine", 9)

return Number(answer)
}


회고
- split() + join() : 해결1에서 split()으로 쪼개면서 생긴 빈 공간에 무언가를 추가할 때 join() 메소드를 사용하면 된다는 점이 흥미롭다.

- 반복문 i를 활용하기 : 반복문에서 i를 인덱스로만 사용하기만 했는데, 해결1은 i를 replace할 단어로 활용했다는 점에서 사용성을 높인 코드라고 생각한다. 만약 0, 1, 2와 같이 순차적인 데이터를 처리해야 할 경우 반복문 i의 인덱스를 활용해야겠다는 생각이 들었다.

- replace()메소드와 replaceAll() 메소드는 다르다 : 찾아보니 replace() 메소드와 replaceAll() 메소드가 따로 있음을 알게되었다. 전자는 하나만 변경하고 후자는 조건에 충족되는 모든 요소를 바꾼다. 내가 시도했던 방식은 조건에 충족되는 요소 하나만 바꾸는 코드였기에 계속 에러가 발생했던 것임을 알게되었다.


레퍼런스
https://school.programmers.co.kr/learn/courses/30/lessons/120894

댓글