-
(Java) Programmers 전화번호 목록 [Set, HashSet]Algorithm 2023. 5. 21. 09:06728x90반응형
- 목차
소개.
아래 링크는 "Programmer 의 전화번호 목록" 문제의 웹링크입니다.
https://school.programmers.co.kr/learn/courses/30/lessons/42577
문제 설명.
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.제한 사항phone_book의 길이는 1 이상 1,000,000 이하입니다.- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
입출력 예제
["119", "97674223", "1195524421"] false ["123","456","789"] true ["12","123","1235","567","88"] false 문제 분석.
배열의 모든 원소들을 2개씩 비교를 해야하기 때문에 2중 반복문을 수행해야합니다.
시간복잡도 O(n) 은 n 의 제곱의 시간복잡도를 가집니다.
그래서 일반적인 비교를 위해 반복문을 수행하면 시간 초과가 발생합니다.
시간소모를 줄이기 위해서 Set 자료구조를 사용하며,
Set 에 데이터를 추가하는데에 O(n) = n
전화번호를 비교하는데에 , O(n) = n * m
만큼 시간복잡도를 설정할 것입니다.
전화번호 길이 m 은 20 이하이므로 시간복잡도를 줄일 수 있습니다.
문제 풀이.
import java.util.*; class Solution { public boolean solution(String[] phoneBook) { Set<String> phoneSet = new HashSet(); for (String phone : phoneBook) { phoneSet.add(phone); } for (String phone : phoneBook) { for (int i = 1; i < phone.length(); i++) { String prefix = phone.substring(0, i); if (phoneSet.contains(prefix)) { return false; } } } return true; } }
반응형'Algorithm' 카테고리의 다른 글
[Programmers] 가격대 별 상품 갯수 구하기 (SQL) (0) 2023.06.12 [Programmers] 택배상자 (lv2, Java, Stack) (0) 2023.06.07 [Programmers] 롤케이크 자르기 (Map, Set, Categorical) (0) 2023.05.12 [Programmers] 프로세스 (Stack, Queue, 우선순위) (0) 2023.05.12 [Programmers] 디펜스 게임 (우선순위 큐, Priority Queue) (0) 2023.05.12