알고리즘 전화번호 목록

이명진·2024년 7월 2일
0

코드카타

목록 보기
70/74

해시 문제이다.

문제 요약

전화번호가 주어지고 전화번호 중에 전화번호가 접두어가 되는 것이 있다면 false를 리턴하면 된다.

내가 푼 풀이

접근 방법: 해시 문제라고 해서 map 을 써야 겠다 라고 생각했다.

map을 단순히 사용해서 key값을 비교해서 이중 포문을 돌려보니 시간이 엄청 느릴것 같다는 생각이 들었지만 도전해봤는데
역시나 효율성에서 시간초과가 나왔다.

도서관처럼 요약된 정보로 관련된 정보들을 모아두고 그곳에서 다시 순회를 돌리면 이전보다 빨라지지 않을까 생각해서 문제를 풀게 되었다.

일단 정렬을 하고 제일 작은 글자의 길이만큼 쪼개서 map에 등록해주고 만약에 일치한다면 거기서 key값을 돌려서 일치되는 전화번호를 찾게 하였다.

function solution(phone_book) {
    var answer = true;
    let books = new Map();
    let sorted = phone_book.sort((a,b)=>a.length-b.length);

    let min = sorted[0].length;
  
    for(let num of phone_book){
     let hash = num.slice(0,min);

      if(books.get(hash)){
        let arr = books.get(hash);
        for(let pBook of arr){
            if(pBook.length>num.length){
            continue;
          }
          if(num.includes(pBook)){
            return false
          }
        }
     
        
      }else{
        
      books.set(hash,[num])  
      }
      
      
    }

    return answer;
}

결과는 성공

다른 사람들의 풀이를 보았다.

다른사람의 풀이 1등

function solution(phoneBook) {

    return !phoneBook.sort().some((t,i)=> {

        if(i === phoneBook.length -1) return false;

        return phoneBook[i+1].startsWith(phoneBook[i]);        
    })
}

간결한 함수이다. startsWith를 몰랐다. 접두어를 찾는데 아주 좋아보이는 함수이다.
다른 사람들의 접근들은 정렬을 한다음에 앞뒤값들만 비교를 해주었다.

성능은 확실히 좋았다. 앞뒤만 확인하니 성능 비교는 좋았는데

해시 관련 문제로써 해시를 활용했다는 것만으로도 내 코드에 만족을 했다.

이런 접근 방법도 있구나 라는 생각을 했다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글

관련 채용 정보