[programmers] 핸드폰 번호 가리기- JS

김태훈·2022년 1월 17일
0

알고리즘

목록 보기
1/2

프로그래머스에 있는 핸드폰 번호 가리기 문제를 풀어보도록 하겠습니다. 문제는 다음과 같습니다.

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

저는 이 문제를 총 네 번 풀어봤는데 각각의 과정들을 소개해보도록 하겠습니다.

우선, 처음에는 map함수를 활용해봤습니다.

function solution(phone_number) {
    let arr = phone_number.split('')
    let newArr = arr.map((i, index) => {
        if (index < arr.length - 4) {
            return "*"
        } else {
            return i
        }
    })
    return newArr.join("");
}

테스트 1 〉	통과 (0.07ms, 30.2MB)
테스트 2 〉	통과 (0.09ms, 30.2MB)
테스트 3 〉	통과 (0.08ms, 30MB)
테스트 4 〉	통과 (0.07ms, 30.3MB)
테스트 5 〉	통과 (0.08ms, 30.4MB)
테스트 6 〉	통과 (0.06ms, 30.3MB)
테스트 7 〉	통과 (0.07ms, 30.4MB)
테스트 8 〉	통과 (0.09ms, 30MB)
테스트 9 〉	통과 (0.06ms, 30.1MB) ***
테스트 10 〉	통과 (0.09ms, 30.3MB)
테스트 11 〉	통과 (0.07ms, 30.1MB) ***
테스트 12 〉	통과 (0.07ms, 30.3MB)
테스트 13 〉	통과 (0.10ms, 30.3MB)

그 다음에 개인적으로 변수를 너무 많이 쓰고 있다는 생각이 들어 변수 없이 시도해봤습니다.

function solution(phone_number) {
    return (
      phone_number.split("").map((i, index) => {
        if (index < phone_number.length - 4) {
            return "*"
        } else {
            return i
        }}
      ).join("")
    )
}

테스트 1 〉	통과 (0.09ms, 30.3MB)
테스트 2 〉	통과 (0.09ms, 30.3MB)
테스트 3 〉	통과 (0.06ms, 30.3MB)
테스트 4 〉	통과 (0.06ms, 30.2MB)
테스트 5 〉	통과 (0.06ms, 30.2MB)
테스트 6 〉	통과 (0.12ms, 30.2MB)
테스트 7 〉	통과 (0.06ms, 30.4MB)
테스트 8 〉	통과 (0.06ms, 30.2MB)
테스트 9 〉	통과 (0.05ms, 30.2MB)
테스트 10 〉	통과 (0.06ms, 30MB)
테스트 11 〉	통과 (0.08ms, 30MB)
테스트 12 〉	통과 (0.06ms, 30.1MB)
테스트 13 〉	통과 (0.07ms, 30.2MB)

테스트 통과까지 걸린시간이 약간 줄어들었는데 변수 할당이 적어서 그런거겠죠..?

그 다음에 생각을 해보다가 쓸 수 있는 문자열, 배열 메소드들을 활용해 보고 싶다는 생각이 들어서 다음으로는 shift()와 unshift()를 써봤습니다. 이것보다 더 효율적으로 만들 수 있을 것 같은데 하드코딩했다는 느낌이 좀 드네요..

function solution(phone_number) {
    let arr = phone_number.split('')
    let cnt = 0
    for (let i = 0; i < phone_number.length - 4; i++) {
        arr.shift()
        cnt++
    }
    for (let i = 0; i < cnt; i++) {
        arr.unshift("*")
    }

    return arr.join("");
}

테스트 1 〉	통과(0.08ms, 30.1MB)
테스트 2 〉	통과(0.05ms, 30.4MB)
테스트 3 〉	통과(0.05ms, 30.4MB)
테스트 4 〉	통과(0.07ms, 30.2MB)
테스트 5 〉	통과(0.08ms, 29.9MB)
테스트 6 〉	통과(0.13ms, 30.3MB)
테스트 7 〉	통과(0.05ms, 30.5MB)
테스트 8 〉	통과(0.08ms, 30MB)
테스트 9 〉	통과(0.05ms, 30.2MB)
테스트 10 〉	통과(0.15ms, 30.3MB)
테스트 11 〉	통과(0.05ms, 30.4MB)
테스트 12 〉	통과(0.06ms, 30.2MB)
테스트 13 〉	통과(0.08ms, 30.2MB)

통과까지 걸린 시간은 바로 위에 코드보다는 조금 더 길긴 합니다.

마지막은 다른 분의 풀이였는데요. 코딩테스트는 항상 다른 사람의 코드를 보면서 반성하게 되는 것 같습니다..

function solution(phone_number) {
    return "*".repeat(phone_number.length - 4) + phone_number.slice(-4)
}

테스트 1 〉	통과 (0.03ms, 30.4MB)
테스트 2 〉	통과 (0.10ms, 30.2MB)
테스트 3 〉	통과 (0.03ms, 30.2MB)
테스트 4 〉	통과 (0.05ms, 30.3MB)
테스트 5 〉	통과 (0.03ms, 30.1MB)
테스트 6 〉	통과 (0.03ms, 30.2MB)
테스트 7 〉	통과 (0.04ms, 30.4MB)
테스트 8 〉	통과 (0.05ms, 30.4MB)
테스트 9 〉	통과 (0.11ms, 30.4MB) ***
테스트 10 〉	통과 (0.03ms, 30.3MB)
테스트 11 〉	통과 (0.11ms, 30.3MB) ***
테스트 12 〉	통과 (0.03ms, 30.2MB)
테스트 13 〉	통과 (0.03ms, 30.5MB)

메소드들을 잘 활용하면서 간결하기까지한.... respect.... 심지어 시간도 제일 빠르네요.

이렇게 몇 번씩 풀어보면서 찾아낸 부분이 있는데 첫 번째 풀었던 코드(평균적인 시간은 느림)의 테스트 9,11번 시간은 가장 짧은 반면, 마지막 코드(평균적인 시간은 제일 빠름)의 테스트 9,11번은 가장 길다는 점인데요.

아마 특정 케이스에 대해 메소드로 조작하는 것이 조금 더 오래 걸리지 않았나싶은데 아직까지 왜 그런지는 모르겠습니다.. 더 공부를 하다보면 알 수 있겠죠?

profile
1일 1커밋 1블로그!

0개의 댓글