[Hash] 전화번호 목록

서은경·2022년 4월 4일
0

CodingTest

목록 보기
2/71
public static boolean solution(String[] phone_book) {
    
        boolean answer = true;

        Arrays.sort(phone_book);

        int leng = phone_book[0].length();
        for (int i = 1; i < phone_book.length; i++) {
            if(leng >= phone_book[i].length()) {
                leng = phone_book[i].length();
            }
        }

        //System.out.println(leng);

        HashMap<String, Integer> hm = new HashMap<>();

        for (String ph : phone_book) {
            hm.put(ph.substring(0, leng), hm.getOrDefault(ph.substring(0, leng), 0)+1);
        }

        for (String key : hm.keySet()) {
            //System.out.println(key + " " + hm.get(key));
            if(hm.get(key)>1) {
                answer = false;
            }
        }

        return answer;
    }

테스트 케이스 딱 두개만 계속 실패가 뜬다.
도저히 반례를 알 수가 없어서 풀이를 좀 봤는데 다른 사람의 풀이는 해쉬맵을 이용하지 않고 배열을 오름차순으로 정렬 후 startsWith 함수로 체크했다.

boolean startsWith(String prefix)
특정 문자 또는 특정 문자열로 시작하는지 체크하는 함수

boolean endsWith(String suffix)
특정 문자 또는 특정 문자열로 끝나는지 체크하는 함수

난 일단 오름차순 정렬후 가장 짧은 번호의 길이를 체크했고 다른 번호들을 다 그 길이 기준으로 잘라서 해쉬맵에 넣어줬다. 중복되어 들어간 번호가 있으면 false를 반환하여 구분하려고 했는데 두 가지 케이스에서만 실패한다. 반례가 뭔지 알 수가 없어서 헤매는중 ..ㅠㅠㅠ

이건 참고할 때 봤던 다른 사람 소스

 /*
        boolean answer = true;

        int p_cnt = phone_book.length;
        Arrays.sort(phone_book);
        for(int i=0; i<p_cnt-1; i++) {
            if(phone_book[i+1].startsWith(phone_book[i])) {
                answer = false;
                break;
            }
        }

        return answer;
 */

0개의 댓글

관련 채용 정보