문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
제한 사항
phone_book의 길이는 1 이상 1,000,000 이하입니다.
각 전화번호의 길이는 1 이상 20 이하입니다.
같은 전화번호가 중복해서 들어있지 않습니다.
풀이
처음엔 단순반복문으로 풀어냈지만 만약 phone_book에 접두사가 없을 경우 끝나지않고 전부 돌아버리는 문제로 인해 시간초과되어 올바른 풀이로 끝나지 않았다
이 문제를 해결하려고 찾다가
문자열 정렬은 글자 수가 아닌 앞글자에 따라 정렬되는 것을 알아냈고
그렇다면 앞글자와 뒷글자는 접두사를 판별하기 위한 조건으로 쓸 수 있어 단일 반복문으로 풀이할 수 있었다
허나 이번 문제는 직접 내가 생각한 것이 아닌 다른 사람의 풀이를 보고 유추해낸 것이기 때문에
나중에 또 이중 for문이 나온다면 어떤 방식으로 단일 반복문으로 바꿀지 좀더 유연하게 생각 할 필요가 있어보인다
풀이 - 시간 초과
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
boolean answer = true;
Arrays.sort(phone_book);
for(int i=0; i<phone_book.length; i++){
for(int j=0; j<phone_book.length; j++){
if(phone_book[i].startsWith(phone_book[j])&&i!=j){
return false;
}
}
}
return answer;
}
}
풀이 - 정렬 후 뒤와 비교하기
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
boolean answer = true;
Arrays.sort(phone_book);
for(int i=0; i<phone_book.length-1; i++){
String s1 = phone_book[i];
String s2 = phone_book[i+1];
if(s2.startsWith(s1)){
return false;
}
}
return answer;
}
}
'programmers' 카테고리의 다른 글
[JAVA] 할인 행사 - Arrays.equals() (0) | 2024.07.23 |
---|---|
[JAVA] 이중우선순위큐 (1) | 2024.07.23 |
[JAVA] 짝지어 제거하기 (0) | 2024.07.23 |
[JAVA] 디펜스 게임 - PriorityQueue (1) | 2024.07.23 |
[JAVA] 혼자서 하는 틱택토 (5) | 2024.07.23 |