Programing/Programers

[JAVA] 해시 : 전화번호 목록

블스뜸 2025. 4. 14. 13:34

문제내용

처음 문제를 풀었을 때 정렬을 하면 쉽지않나?라는 생각으로 문제를 풀어봤다

import java.util.Arrays;

class Solution {
    public boolean solution(String[] phone_book) {
    	// 정렬
        Arrays.sort(phone_book);
		// 순차적으로 시작이 같은 부분을 찾기
        for (int i = 0; i < phone_book.length - 1; i++) {
            if (phone_book[i + 1].startsWith(phone_book[i])) {
                return false;
            }
        }

        return true;
    }
}

위의 코드로도 해결이 되지만 해시로도 해결해보고 싶었다


해시로 구현한다면 이렇게 구현할 수가 있다

import java.util.HashSet;
import java.util.Set;

class Solution {
    public boolean solution(String[] phone_book) {
        HashSet<String> phoneSet = new HashSet<>();

        // 모든 전화번호를 해시에 저장
        for (String phone : phone_book) {
            phoneSet.add(phone);
        }

        // 모든 번호를 한글자씩 늘려가며 비교
        for (String phone : phone_book) {
            for (int i = 1; i < phone.length(); i++) {
                String prefix = phone.substring(0, i);
                if (phoneSet.contains(prefix)) {
                    return false;
                }
            }
        }

        return true;
    }
}


일단 둘의 시간복잡도는 정렬은 NlogN 해시는 평균적으로 N*L이지만 최악의 경우 N*(L^2)까지도 나올 수 있다
하지만 평군적으로 해시가 빠르다고 볼 수 있으므로 해시를 사용하는게 더 좋은 경우가 많다라고 생각할 수 있다