전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 작성해주세요.
우선 배열을 정렬합니다. sort 메소드 특성상 1,2,13,24... 순서가 아닌, 1,13,2,24... 순서로 정렬되기 때문에 접두사 검사를 하기 용이합니다. 정렬하지 않았을 경우 이중 for문 등으로 한 요소와 다른 모든 요소를 다 검사해야겠지만, 정렬할 경우 인접한 요소만 검사해도 무방합니다.
그 다음, 반복하면서 해당 요소와 그 다음에 나오는 요소를 검사하여 포함될 경우 false를, 아닐 경우 true를 반환합니다.
검사의 경우 접두사이므로 startWith 메소드를 사용합니다.
function solution(phone_book) {
let answer = true;
const a = phone_book.sort();
for (let i = 0; i < a.length - 1; i++) {
if (a[i+1].startsWith(a[i])){
answer= false;
break;
}
}
return answer;
}
위의 설명을 그대로 코드로 옮기면 위와 같습니다. 이때 주의해야 할 점은, 마지막 요소는 그 다음 요소와 검사할 수 없으므로 검사 범위를 배열의 길이에서 -1 만큼 제한해야 한다는 것입니다.
function solution(phoneBook) {
phoneBook.sort();
return !phoneBook.some((number, i) => i < phoneBook.length - 1 && phoneBook[i + 1].startsWith(number));
}
문제 풀이 중 신박한 방법이 있어서 기록해두겠습니다.
우선 phoneBook을 정렬합니다.
이제 반환할 값을 작성하는데, some 메소드를 사용하여 number과 i를 매개변수로 받습니다. 만약 i가 phoneBook의 길이보다 -1만큼, 즉 마지막 요소보다 작고, phoneBook의 i+1번째가 i의 value 값인 number로 시작한다면, true를 반환합니다.
그런데 여기서, 해당 식을 만족할 경우 false를 반환하라고 했으므로 앞에 !로 부정해주어 바꿉니다.