본문 바로가기
Algorithm/프로그래머스

[Java][프로그래머스] Level 2. 전화번호 목록

by jisu-jeong0 2024. 7. 18.

 

https://school.programmers.co.kr/learn/courses/30/lessons/42577

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

 

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

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

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

 

제한 사항
  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

 

입출력 예제


 

🌴 아이디어

1. 어느 한 번호가 다른 번호의 접두어인지 확인해야 한다.

2. 키 값으로 다른 값들을 빠르게 찾아야 하므로 HashMap을 쓴다. 

3. 한 단어의 인덱스만큼 다른 단어를 잘라서 동일한지 확인하자.

 

 

🍦 주요 코드

1️⃣ 전화번호 목록을 Map에 저장

Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < phoneBook.length; i++) {
    map.put(phoneBook[i], i);
}

 

HashMap<String, Integer> map을 사용하여 전화번호를 키, 전화번호의 인덱스를 값으로 저장한다.

 

2️⃣ 접두사 확인

for (int i = 0; i < phoneBook.length; i++) {
    for (int j = 0; j < phoneBook[i].length(); j++) {
        if (map.containsKey(phoneBook[i].substring(0, j))) {
            return false;
        }
    }
}
return true;

 

한 접두사가 다른 전화번호 목록에 존재하는지 확인한다. 이를 위해 이중 for문을 사용한다.

  • 첫번째 반복문은 phoneBook 배열의 크기만큼 전화번호를 순회한다.
  • 두번째 반복문은 phoneBook[i]의 길이만큼 순회한다.
  • phoneBook[i].substring(0, j)는 전화번호 phoneBook[i]의 0번째 인덱스부터 j-1번째 인덱스까지의 부분 문자열을 생성한다.
  • map.containsKey(phoneBook[i].substring(0, j))는 생성된 접두사가 map에 존재하는지 확인한다.
  • 접두사가 존재한다면, false를 반환한다.

반복문이 종료된 후에도 접두사가 다른 전화번호에 존재하지 않는다면 true를 반환한다.

 

 

🍨 전체 코드

import java.util.*;

class Solution {
    public boolean solution(String[] phoneBook) {
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < phoneBook.length; i++) {
            map.put(phoneBook[i], i);    
        }
        
        for (int i = 0; i < phoneBook.length; i++) {
            for (int j = 0; j < phoneBook[i].length(); j++) {
                if (map.containsKey(phoneBook[i].substring(0, j))) {
                    return false;
                }
            }
        }
        
        return true;
    }
}