프로그래머스에 있는 핸드폰 번호 가리기 문제를 풀어보도록 하겠습니다. 문제는 다음과 같습니다.
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 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번은 가장 길다는 점인데요.
아마 특정 케이스에 대해 메소드로 조작하는 것이 조금 더 오래 걸리지 않았나싶은데 아직까지 왜 그런지는 모르겠습니다.. 더 공부를 하다보면 알 수 있겠죠?