본문 바로가기

코딩테스트/자바 코테

[프로그래머스] 전화번호 목록 코딩테스트 (Lv.2 / 해시) / 접두사 검사에는 .startsWith()를 쓰자

문제 설명

 

더보기

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한사항

더보기

phone_book의 길이는 1 이상 1,000,000 이하입니다.

각 전화번호의 길이는 1 이상 20 이하입니다.

같은 전화번호가 중복해서 들어있지 않습니다.

 

 

문제 이해하기

  • 전화번호부에 적힌 전화번호들 : phone_book 배열에 담겨져서 들어올 것임
  • 어떤 번호가 다른 번호의 접두어인지만 파악해서 T, F return 하면 됨

 

문제 설계하기

절망편 : 루프 계속 돌리면..되긴할거같은데..시간도 엄청 오래걸리고....효율적이지 않을 거 같음....

희망편 : 배열 속에 있는 전화번호를 오름차순으로 sorting > 루프를 한번만 돌려서 [0]번째, [1] 번째 두 개 숫자 앞부분 확인 > 숫자 앞부분이 뒷 숫자의 접두어인지 확인하고 T , F 확인!! (접두어가 맞으면 false, 접두어가 아니면 true 리턴하라고 함)

배열 phone_book의 배열의 길이는 1 이상 1,000,000 이하라고 했으니 루프도 당연히 백만개 - 1 만큼 돌리면 될 거라고 생각했다.

 

//1. phone_book 배열을 정렬한다 (오름차순으로)

 

 정답 제출

import java.util.Arrays;

class Solution {
    public boolean solution(String[] phone_book) {
        
        //1. phone_book을 오름차순으로 정렬
        Arrays.sort(phone_book);
            
        //2. 1중 loof를 돌면서 앞번호가 뒷번호의 접두어인지를 확인하기
        for(int i = 0; i<phone_book.length - 1; i++) {
            //length는 1부터 카운트해서 배열의 인덱스값과 맞지가 않음.. 그래서 -1을 해서 0부터 시작하게끔 설정값 조정
            //phone_book[i+1] : 뒷번호
            if((phone_book[i+1]).startsWith(phone_book[i]))
                return false;
            }
        //3. 여기까지 오지 못했으면 접두어가 없다는 것 췍췍
        return true;
    }
}

 

디테일 설명

전체 코딩 중 주목해서 볼 부분이 이 부분이라고 생각한다

if((phone_book[i+1]).startsWith(phone_book[i]))
                return false;

 

풀이

phone_book[i+1] : 뒷번호

.startsWith(매개변수) 메서드 : 특정 접두사가 있는지 검사할 때 자주 쓰임

String Name = "바밤바";
if (Name.startsWith("바밤바룰라뿌빠뿌")) {
    System.out.println("변수이름이 '바밤바'로 시작합니다.");
}

Name 변수 : 검사의 기준이 되는 필터 단어 ex. ctrl+f에 적는 단어

Name.startsWith(검사를 할 단어나 변수)

이렇게 생각을 하면 된다!

 

그래서 

if((phone_book[i+1]).startsWith(phone_book[i]))
                return false;
                
//phone_book 배열에 있어서 i번째 배열의 숫자가 i+1번째 배열의 숫자와 같다면(앞배열 숫자가 뒷배열 숫자의 접두어라면)
false를 반환해라