[프로그래머스/42577] 전화번호 목록

☑️ 문제

프로그래머스 42577

☑️ 풀이

실패한 풀이

  • phone_book을 오름차순 정렬 후, 첫 번째 전화번호의 길이를 구한다.
    substring() 메서드를 써서 해당 원소의 길이만큼 다음 원소를 자른다.
    HashSet에 자른 원소를 먼저 추가 후 첫 번째 전화번호를 추가해서 size의 변화가 있다면 false를 리턴하고, 없다면 다음 순서로 넘어가도록 했다.
  • 이 방법으로 하니 일부는 통과되지만, 런타임에러가 발생한다.
import java.util.*; 

class Solution {
    public boolean solution(String[] phone_book) {        
        Arrays.sort(phone_book);
        Set<Integer> set = new HashSet<>();
        
        for (int i = 0; i < phone_book.length; i++) {
            int num = Integer.parseInt(phone_book[i]);
            for (int j = i + 1; j < phone_book.length; j++) {
                set.add(Integer.parseInt(phone_book[j].substring(0, phone_book[i].length())));
                int size = set.size();
                set.add(num);
                if (size != set.size() - 1) {
                    return false;
                } else {
                    set.remove(num);
                }
            }
            set.clear();
        }
        
        return true;
    }
}

Image

성공한 풀이

  • HashSet에 모든 번호를 다 넣었다.
  • 반복문을 통해 phone_book 의 번호를 순차적으로 꺼내, 해당 번호를 substring() 으로 잘라가면서 HashSet에 있는 번호와 일치하는 게 있는지 확인한다.
//시간: 10.61ms
//메모리: 91.7MB

import java.util.*;

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

        for (int i = 0; i < phone_book.length; i++) {
            set.add(phone_book[i]);
        }

        for (String str : phone_book) {
            for (int j = 1; j <= str.length(); j++) {
                if (set.contains(str.substring(0, j))
                        && !str.equals(str.substring(0, j))) {
                    return false;
                }
            }
        }

        return true;
    }
}

Image


© 2021. All rights reserved.

yaejinkong의 블로그