algorithm/알고리즘 풀이 내역

[Programmers] 해시.전화번호 목록

buddev 2025. 4. 20. 19:07

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

어려운 문제는 아니고 간단하지만 약간의 고민이 필요한 문제 (그냥 풀면 효율성 채점에서 틀림)

 

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        Set<String> set = new HashSet<>();
        Set<String> original = new HashSet<>();
        for (String str : phone_book) {
            original.add(str);
        }
        for (String str : phone_book) {
            // 자기 자신은 제외해야 함 
            for (int i = 0; i < str.length(); i++) {
                if (!set.add(str.substring(0, i + 1))) {
                    if (original.contains(str.substring(0, i + 1))) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

 

자기 자신은 제외하는게 좋음

현재 코드에서는 효율성을 위해 set을 두개 쓰기 때문에 상관없지만

set을 하나만 쓰는 경우 실패하게 됨

ex) 1234라는 값이 있으면 - 1, 12, 123, 1234 모두를 set에 넣게되어 무조건 false가 반환된다.

 

현재 코드에서는 자기 자신을 포함하더라도 원본 값 set인 Original에서 한번 더 값을 체크하기 때문에 성공하지만

굳이 넣을 필요가 없으므로 (의미상 안 넣는게 맞음), 빼는게 더 낫다고 생각함