[문제]
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
[제한 사항]
- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
[Algorithm]
1. HashSet에 모든 번호 저장
2. 각 전화번호에 대해 가능한 모든 접두어를 생성
3. 생성된 접두어가 HashSet에 존재하는지 확인
[Code]
import java.util.HashSet;
public boolean solution(String[] phone_book) {
// 모든 전화번호를 HashSet에 저장
HashSet<String> hs = new HashSet<>();
for (String p : phone_book) {
hs.add(phone);
}
// 각 번호의 모든 접두어 확인
for (String p : phone_book) {
// 길이 1부터 (전체길이-1)까지의 접두어 생성
for (int i = 1; i < p.length(); i++) {
String prefix = p.substring(0, i);
// 생성된 접두어가 실제 전화번호인지 확인
if (hs.contains(prefix)) {
return false;
}
}
}
return true;
}
[+ 다른 사람 풀이]
class Solution {
public boolean solution(String[] phoneBook) {
for(int i=0; i<phoneBook.length-1; i++) {
for(int j=i+1; j<phoneBook.length; j++) {
if(phoneBook[i].startsWith(phoneBook[j])) {return false;}
if(phoneBook[j].startsWith(phoneBook[i])) {return false;}
}
}
return true;
}
}
브루트 포스(완전 탐색) 방식으로 이중 반복문을 사용한 방식
이 풀이는 문제가 수정되면서 효율성 검사 통과를 못한다고 한다 ..
해시를 활용한 코드에 비해 비교를 1번 더 수행하기 때문에 효율성이 떨어짐
→ 번호가 많아질수록 부르트 포스는 더 비효율적이 됨!
하지만 startsWith() 라는 메서드를 알게되었다는 점에 의미가 있음ㅋ
[+ Plus]
더보기
더보기
💡String 클래스의 startsWith()/endsWith() 메서드
- boolean startsWith(String prefix)
→ 문자열이 지정된 접두어(prefix)로 시작하는지 확인 후 true, false 반환
- boolean endsWith(String suffix)
→ 문자열이 지정된 접미어(suffix)로 끝나는지 확인 후 true, false로 반환
'Algorithm Study' 카테고리의 다른 글
[Java Algorithm] 프로그래머스 Lv.3 _ 베스트앨범 (1) | 2025.07.28 |
---|---|
[Java Algorithm] 프로그래머스 Lv.2 _ 의상 (3) | 2025.07.28 |
[Java Algorithm] 프로그래머스 Lv.0 _ 주사위 게임 3 (2) | 2025.03.13 |
[Java Algorithm] 프로그래머스 Lv.0 _ 간단한 논리 연산 (1) | 2025.03.05 |
[Java Algorithm] 프로그래머스 Lv.0 _ 배열 만들기 4 (0) | 2025.02.25 |