본문 바로가기
알고리즘/문제 풀이

[프로그래머스] 전화번호 목록(JAVA) / 해시 Level2

by 민죠미 2023. 3. 17.

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

 

프로그래머스

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

programmers.co.kr

 

컬렉션 함수를 잘 이용하면 간단히 풀릴 문제였는데 적절한 사용을 못하고 슬라이딩 윈도우로 풀다가 인덱스바운더리 에러만 맛봤다... 가슴이 아파서 정리해둔다

내가 참 간과한 것이 있는데, String 배열도 배열이라 Arrays.sort() 가 사용가능 하다는 점, 그리고 사전순서대로 정렬이 된다는 점이다.
대체 왜 막연히 길이가 짧은 순서대로 정렬이 된다고 생각했던 걸까... 아래와 같이 시험해보니 길이가 긴 문자열이라도 사전순으로 앞이면 앞에 정렬된다.

String[] s = {"119", "97674223", "1195524421", "11111111111111111111111111"};
for (String s1 : s) {
    System.out.println(s1);
}
Arrays.sort(s);
System.out.println();
for (String s1 : s) {
    System.out.println(s1);
}
// 출력결과
119
97674223
1195524421
11111111111111111111111111

11111111111111111111111111
119
1195524421
97674223

 

Arrays.sort() + for문 풀이

이 코드에서 포인트는 String.startsWith() 함수다. 이런 함수가 있다는 사실조차 까먹고 있었다...
이 함수를 사용하면 i와 i+1번째 문자열 중에 어떤것이 더 긴지에 대한 고려를 할 필요도 없다. (함수가 알아서 해주니까...)

import java.util.Arrays;

class Solution {
    public boolean solution(String[] phoneBook) {
        Arrays.sort(phoneBook);

        for (int i = 0; i < phoneBook.length - 1; i++)
            if (phoneBook[i + 1].startsWith(phoneBook[i]))
                return false;
        
        return true;
    }
}

성공은 하는데 좀 느린감이 있다.

 

HashMap 사용 풀이

해쉬맵 가지고 정말 별의 별짓을 다해봤는데... containsKey() 함수가 포인트다.
정렬할 필요 없이, 문자열 마다 substring(0,j) 씩 부분 문자열을 추출해 containsKey() 로 검색하면 빠르게 해결할 수 있다.

import java.util.HashMap;

class Solution {
    public boolean solution(String[] phoneBook) {
        HashMap<String, Integer> hp = new HashMap<>();
        for (String s : phoneBook) {
            hp.put(s, hp.getOrDefault(s, 0) + 1);
        }
        for (int i = 0; i < phoneBook.length; i++) {
            for (int j = 0; j < phoneBook[i].length(); j++) {
                if (hp.containsKey(phoneBook[i].substring(0, j))) {
                    return false;
                }
            }
        }

        return true;
    }
}

확실히 정렬+for문 보다 성능이 좋다.

 

 

댓글