Level 2️⃣ - 전화번호 목록

2024. 4. 5. 14:25알고리즘/프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/42577

 

프로그래머스

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

programmers.co.kr

 

🚀해시를 활용한 풀이

문제의 요구사항은 어떤 번호가 다른 번호의 접두어가 될 수 있는지 확인하는 것이다. 조금 어렵게 표현하면 어떤 번호가 통째로 다른 번호의 부분이 된다는 것이다.

그렇다면 주어진 모든 번호가 접두어가 될 수 있기에 해시를 통해 정리를 하고, 각각의 번호들마다 접두어를 만들어보면서 다른 번호가 해당 번호의 접두어가 될 수 있는지 확인하면 된다.

말이 조금 어려운데 코드로 보면 더 이해가 쉽다.

function solution(phone_book) {
    const h = new Map();
    phone_book.forEach((elem)=> h.set(elem, true));
    for(const n of phone_book){
        let prefix = "";
        for(const d of n){
            prefix += d;
            if(h.has(prefix) && prefix !== n){
                return false;
            }
        }
    }
    return true;
}

이때 접두어가 자기 자신이 되는 경우는 제외해야하므로 prefix !== n 조건을 추가해야한다.

 

🚀Sort를 활용한 풀이

Sort는 콜백함수를 정의하지 않을 시, 문자로 변환하고 유니코드 포인트 기반으로 정렬을 한다.

그러니까 사전식으로 정렬이 된다는 말인데, 이 특징을 이용해서 더 짧고 간결한 구현이 가능하다.

어차피 어떤 단어가 다른 단어의 접두사가 된다는 것은 그 단어보다 사전적으로 앞에 위치하게 된다.

따라서 정렬 후에 앞의 단어가 뒤의 단어의 접두어가 되는지 확인하면 된다.

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;
    }
    return true;
}

startsWith는 인자로 들어간 문자열로 해당 문자열이 시작된다면 true, 아니면 false를 반환한다.

'알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 2️⃣ - 롤케이크 자르기  (1) 2024.04.07
Level 2️⃣ - 방문길이  (0) 2024.04.07
Level 2️⃣ - 튜플  (0) 2024.04.03
Level 2️⃣ - 기능개발  (0) 2024.04.03
Level 2️⃣ - H-Index  (0) 2024.04.03