[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
반응형