Bin's Blog

[프로그래머스] Level2 - 전화번호 목록(Javascript) 본문

Algorithm

[프로그래머스] Level2 - 전화번호 목록(Javascript)

hotIce 2023. 9. 12. 18:27
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝문제 요약

1️⃣ 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.

2️⃣ 전화번호부에 적힌 전화번호를 담은 배열 phone_book이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

 

✅ 정답 코드(수정 전)

function solution(phone_book) {
    let answer = true;
    // 빈 객체를 만든다
    let obj = {};
    
    // 객체에 전화번호를 key와 value에 담는다.
    for (const phone of phone_book) {
        obj[phone] = phone;
    }
    
    // 전화번호를 담은 배열의 길이만큼 돌면서
    for (let i = 0; i < phone_book.length; i++) {
        // 문자를 스플릿 한다음에 새로 만들 임시 문자열을 위한 변수
        let temp = "";
        
        // 문자열을 하나씩 쪼개고 더하면서
        for (let p of phone_book[i]) {
            temp += p;
            // 만약에 새로 만든 문자열이 이미 객체에 존재하거나 전화번호부의 번호랑 똑같지 않으면
            if (temp in obj && temp !== phone_book[i]) {
               // 접두어가 존재하므로 false
               return false
            } 
        }
    }
    // 접두어가 존재하지 않으면 true
    return true
}

더 좋은 코드가 없을까하고 다른 사람 코드를 찾아보다가 간략하면서 시간 복잡도, 효율성적인 측면에서 더 좋은 코드를 발견했다.

✅ 정답 코드(다른 사람의 코드)

function solution(phoneBook) {
    // false => true, true => false;
    // some 메서드는 해당하는 값이 존재하면 true를 반환
    // sort로 오름차순 정렬
    return !phoneBook.sort().some((t,i)=> {
        // 만약에 phone_book 배열의 인덱스랑 크기랑 똑같으면 일치하는 접두어가 없으므로 false처리 한다.
        if(i === phoneBook.length -1) return false;
        // startsWith메서드를 활용해서 배열 다음요소가 현재 요소로 시작하는지 체크하고 있으면 true 반환 
        return phoneBook[i+1].startsWith(phoneBook[i]);        
    })
}

 

📔느낀점

👉 메서드를 좀 더 적극적으로 활용해보자. 

728x90