42577. 전화번호 목록
2025-12-04
프로그래머스 42577번 풀이
이 글은 Obsidian에서 마이그레이션되었으며, 그 과정에서 AI의 도움을 받았습니다. 오류나 누락된 내용이 있다면 댓글로 알려주세요!
문제
코딩테스트 연습 - 전화번호 목록 | 프로그래머스 스쿨
풀이
아이디어
phone_book의 최대 길이가 1,000,000이기 때문에 이중 for문으로 모든 쌍을 비교하면 시간 초과가 발생할 것이다. 그래서 Set을 활용해서 접두어 존재 여부를 O(1)에 확인하는 방식을 사용했다.
- 모든 전화번호의 접두어들(자기 자신 제외)을 Set에 저장한다.
- 전화번호 목록을 다시 순회하면서, 해당 번호가 Set에 있는지 확인한다.
- Set에 있다면 그 번호는 다른 번호의 접두어라는 의미이므로 false를 반환한다.
코드
function solution(phone_book) {
const numberSet = new Set();
for (const number of phone_book) {
// 같은 전화번호가 중복해서 들어있지 않으므로 끝번호를 제외한 부분문자열만 구해준다.
for (let len = 1; len < number.length; len++) {
numberSet.add(number.substring(0, len))
}
}
for (const number of phone_book) {
if (numberSet.has(number)) {
return false;
}
}
return true;
}