IT recording...

[PG] 전화번호목록 - Java 본문

Algorithm

[PG] 전화번호목록 - Java

I-one 2022. 3. 28. 21:25

[원문 링크]

https://adorable-aspen-d23.notion.site/PG-c556306cdc3440e58031178200b40e55

 

[PG] 전화번호목록

코드

adorable-aspen-d23.notion.site

코딩테스트 연습 - 전화번호 목록

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

[풀이]

  • hash라고 되어 있지만 문제 보자마자 트라이 사용하는 것 같아서 트라이 사용해봤다.
  • 근데 런타임에러 자꾸 나ㅡㅡ 메모리 초과인가 싶어서 처음에 TrieNode에서 child 배열로 사용하던거 Map으로 바꿔줬는데도 케이스 14-20 싹다 런타임이고 효율성도 런타임에러 ㅠㅠ
  • 그래서 문제가 뭔지 살펴봤는데 로직상으로는 맞아서 아무리봐도 안보였는데 알고보니 처음에 배열 정렬할 때 Comparator 사용한게 문제였던것..
  • {”123”,”12”,”21”} 을 정렬시킬 때 처음에는 트라이 쓰니까 길이가 짧은 것 부터, 그리고 같은 길이에서는 오름차순으로 정렬하기 위해 <수정전>처럼 Comparator를 사용했는데 ⇒ [12, 21, 123]으로
  • 어차피 지금 접두사만 비교하니까 길이가 짧은 것 부터 할 필요 없고 그냥 기본 string정렬로 해도 되는 것이었다. ⇒ [12, 123, 21] 로 정렬됨
  • 사실 수정전처럼 해도 답은 맞는다. 근데 Comparator쓰면 속도가 엄청 느려지는 듯..?
  • Trie개념은 여기를 참고하자
  •  

<수정전>

Arrays.sort(phone_book, new Comparator<String>() { //길이로 정렬
      @Override
      public int compare(String o1, String o2) {
          if(o1.length() > o2.length()){
              return 1;
          }
          else if(o1.length() < o2.length()){
              return -1;
          }
          else{
              return Integer.compare(Integer.parseInt(o1),Integer.parseInt(o2));
          }
      }
  });

<수정후>

Arrays.sort(phone_book);

[풀이]

import java.io.*;
import java.util.*;

class Solution {
    static boolean answer;
    static MyTrie trie = new MyTrie();

    public boolean solution(String[] phone_book) {
       answer = true;
        Arrays.sort(phone_book);

        for(String str:phone_book){
            trie.insert(str);
        }
        return answer;
    }

    static class MyTrie{
        TrieNode root = new TrieNode();

        public void insert(String input){
            TrieNode now = root;

            for(int i=0;i<input.length();i++){
                char ch = input.charAt(i);
                if(now.isEnd){ //지금 노드가 마지막이라는 것은 이미 거쳤다는 뜻
                    answer = false;
                    return;
                }
                if(now.hasChild(ch)){ //자식이 있으면 그냥
                    now = now.getChild(ch);
                }
                else{
                    now.child.put(ch,new TrieNode()); //자식이 없으면 자식 새로 추가
                    now = now.getChild(ch);
                }
            }
            now.isEnd = true;
        }
    }

    static class TrieNode{
        Map<Character, TrieNode> child = new HashMap<>();
        boolean isEnd = false;

        boolean hasChild(char node){
            if(child.containsKey(node)){
                return true;
            }
            else{
                return false;
            }
        }

        TrieNode getChild(char node){
            return child.get(node);
        }
    }
}

얻어가는 것

  • 소팅할 때 Comparator를 사용하면 시간이 엄청 많이 늘어나네..? 뭐지 만약 무조건 사용해야 하면 어떻게 사용하라는거지 흠

느낀점

"220328"

소요 시간 : 1h

'Algorithm' 카테고리의 다른 글

[BOJ] 14890 경사로 - Java  (0) 2022.04.08
[PG] 정수삼각형 - Java  (0) 2022.03.29
[BOJ] 2573 빙산 - Java  (0) 2022.02.19
[BOJ] 7569 토마토 - Java  (0) 2022.02.17
[BOJ] 2517 달리기 - Java  (0) 2022.02.04
Comments