본문 바로가기

프론트엔드 개발자/[코테] How it works, How to solve

[JS] 프로그래머스 코테 - 전화번호 목록 (레벨2)

function solution(phone_book) {
	//문자열 정렬: 비슷한 것끼리(접두어 관계인 것끼리) 바로 옆에 붙게 됩니다.
    //["119", "97674223", "1195524421"] => ["119", "1195524421", "97674223"]
    phone_book.sort();
    
    // 내 바로 뒷사람하고만 비교하면 됩니다. 마지막은 비교할 사람이 없으니 -1을 합니다.
    for(let i=0; i<phone_book.length-1; i++){
    
    	//자바스크립트에는 문자열이 특정 문자로 시작하는지 검사하는 꿀 같은 함수가 있습니다.
		//"1195524421".startsWith("119") → true
        if(phone_book[i+1].startsWith(phone_book[i]))
           return false
       }
    return true;
    }

 

정석 Hash로 풀기

function solution(phone_book) {
    // 1. 해시 맵(Hash Map) 생성
    // 모든 전화번호를 Map에 키(Key)로 등록합니다.
    // 값(Value)은 무엇이든 상관없으니 true로 둡니다.
    const map = new Map();
    for (const number of phone_book) {
        map.set(number, true);
    }
    
    // 2. 모든 전화번호를 하나씩 꺼내서 접두어 검사
    for (const number of phone_book) {
        // 내 번호(number)를 한 글자씩 잘라보며 확인합니다.
        // 예: number가 "1195"라면 -> "1", "11", "119" 순으로 자름
        for (let i = 1; i < number.length; i++) {
            const prefix = number.slice(0, i); // 접두어 생성
            
            // 3. 잘라낸 접두어가 해시 맵에 실제로 존재하는 번호인가?
            if (map.has(prefix)) {
                return false; // 누군가 이 접두어를 번호로 쓰고 있다
            }
        }
    }
    
    return true; // 끝까지 겹치는 게 없으면 통과
}

 

반응형