프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
풀이 과정
해시를 이용해서 전화번호부에 중복된 접두어를 가진 전화번호가 있는지 확인하는 문제다
전화번호는 중복이 없으며 검색을 해야 하므로 Set의 구현체인 HashSet을 이용하기로 했다
HashSet 배열을 생성했으며 배열의 인덱스는 전화번호의 길이다
우선, HashSet 배열에 전화번호를 모두 저장하고,
phone_book에서 전화번호를 하나씩 꺼내면서 해당하는 접두어가 있는지 확인한다
이 과정에서 중복된 접두어를 발견하면 false를 반환하며 모든 전화번호를 확인한 후 중복된 접두어가 없으면 true를 반환한다
결과 코드
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
HashSet<String>[] mapArray = new HashSet[21];
for (int i = 1; i <= 20; i++) {
mapArray[i] = new HashSet<>();
}
for (String s : phone_book) {
mapArray[s.length()].add(s);
}
for (String s : phone_book) {
int size = s.length();
for (int i = 1; i < size; i++) {
if (mapArray[i].contains(s.substring(0, i))) {
return false;
}
}
}
return true;
}
}