[JavaScript] 프로그래머스 전화번호 목록
2023. 9. 1. 13:07ㆍ나는 이렇게 학습한다/Data Structure
이 글은 프로그래머스 전화번호 목록을 풀이한다. 코드는 JavaScript로 구현하였다.
문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
phone_book의 길이는 1 이상 1,000,000 이하입니다.
각 전화번호의 길이는 1 이상 20 이하입니다.
같은 전화번호가 중복해서 들어있지 않습니다.
입출력 예제
입출력 예 설명
입출력 예 #1
앞에서 설명한 예와 같습니다.
입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
풀이
접근
1. 전화번호를 정렬하여 접두어인 경우가 바로 뒤에 나오도록 한다.
자바스크립트 내장 함수인 Array.sort()를 이용해서 정렬 시, ['12', '123', '1235', '567', '88'] 이런 식으로 깔끔하게 정렬된다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
2. 정렬된 전화번호부를 순회하면서 접두어인지 확인한다.
이 때, 자바스크립트 내장 함수인 String.prototype.startsWith()를 이용한다.
startsWith() 메서드는 어떤 문자열이 특정 문자로 시작하는지 확인하여 결과를 true 혹은 false로 반환한다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
3. 만약, 접두어인 경우가 발견되면 false를 반환하고, 반복문을 모두 돌았는데도 false를 반환하지 않았다면 true를 반환한다.
구현
내가 구현한 코드 (오답)
나는 startsWith를 사용하는 대신에, 각 요소를 정수형으로 변환한 뒤 10자리수로 나눠주는 방식으로 비교를 했는데일부 테스트케이스에서 틀렸다고 나왔다. 그리고 효율성 점수도 0점을 받았다..너무 문제를 어렵게 생각했나?
/*
시간: 60분
실패
채점 결과
정확성: 75.0
효율성: 0.0
합계: 75.0 / 100.0
*/
function solution(phone_book) {
let answer = true;
phone_book.forEach((number, index) => {
for (let i = index + 1; i < phone_book.length; i++) {
divide = 10 ** (phone_book[i].length - number.length);
if (+number === Math.floor(+phone_book[i] / divide)) {
answer = false;
}
}
});
return answer;
}
const phone_book = ["119", "97674223", "1195524421"];
console.log(solution(phone_book));
GPT 코드 (정답)
function solution(phone_book) {
// 전화번호부를 정렬하여 접두어인 경우가 바로 뒤에 나오도록 합니다.
phone_book.sort();
// 정렬된 전화번호부를 순회하면서 접두어인지 확인합니다.
for (let i = 0; i < phone_book.length - 1; i++) {
if (phone_book[i + 1].startsWith(phone_book[i])) {
return false; // 접두어인 경우가 발견되면 false 반환
}
}
return true; // 접두어인 경우가 없으면 true 반환
}
const phoneBook1 = ["119", "97674223", "1195524421"];
const phoneBook2 = ["123", "456", "789"];
const phoneBook3 = ["12", "123", "1235", "567", "88"];
console.log(solution(phoneBook1)); // Output: false
console.log(solution(phoneBook2)); // Output: true
console.log(solution(phoneBook3)); // Output: false
반응형
'나는 이렇게 학습한다 > Data Structure' 카테고리의 다른 글
[JavaScript] 프로그래머스 베스트앨범 (0) | 2023.09.05 |
---|---|
[JavaScript] 프로그래머스 의상 (0) | 2023.09.04 |
[JavaScript] 백준 1874번 스택 수열 (0) | 2023.07.07 |
[JavaScript] 백준 5397번 키로거 (0) | 2023.07.03 |
[JavaScript] 백준 1158번 요세푸스 문제 (0) | 2023.06.29 |