seunghyun Note

[프로그래머스] 전화번호 목록 (해시) with JS 본문

코딩테스트/프로그래머스

[프로그래머스] 전화번호 목록 (해시) with JS

승숭슝현 2024. 1. 17. 14:05

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

 

프로그래머스

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

programmers.co.kr

문제 풀이

고득점 키트에 해시가 있어서 문제를 해결해보려고 했다.

1. 해시를 담을 테이블을 생성한다.

2. phone_book의 배열값(문자열)을 index에 넣고 true로 값을 채운다.

3. 다시 문자열 배열을 순회시키면서 slice를 통해 [1,2,3] 이면 [1] , [1,2]까지만 pre로 넣어서 테이블에 있다면

return false를 하고  최종적으로 없으면 return true를 반환한다. 

function solution(phone_book) {
  let has = {};
  for (let value of phone_book) {
    has[value] = true;
  }

  for (let value of phone_book) {

    for (let i = 1; i < value.length; i++) {
      let pre = value.slice(0, i);
      if (has[pre]) return false;
    }
  }
  return true;
}

 

효율적으로 2중 for문이라 좋아보이지는 않는다.

 

2중 for문으로 인해 오래 걸림

 

다른 방법을 찾다가 sort를 통한 문제 해결 방식이 있었다.

1. 문자열을 가지고 있는 배열의 크기가 다 다르기때문에 작은 순으로 정렬합니다.

2. 비교해주기

function solution(phone_book) {
  phone_book.sort(); // 전화번호 리스트를 정렬합니다.

  for (let i = 0; i < phone_book.length - 1; i++) {
    // 현재 번호와 다음 번호의 시작 부분이 같으면 접두어이므로 false를 반환합니다.
    if (phone_book[i] === phone_book[i + 1].substring(0, phone_book[i].length)) {
      return false;
    }
  }

  return true; // 접두어가 없는 경우 true를 반환합니다.
}

728x90