Coding Test/Programmers

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

개발소 2023. 11. 17. 16:11

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42577?language=java

 

프로그래머스

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

programmers.co.kr

 

 

풀이

  • 전화번호부에 적힌 번호 중, 한 번호가 다른 번호의 접두어인 경우를 확인한다.
  • 접두어란, 어떤 단어의 앞에 붙어 뜻을 첨가하거나 다른 단어를 이루는 말이라고 한다.
  • 즉, 01012345678의 접두어는 01, 010, 0101 등이 될 수 있는 것이다.
  • 전화번호부의 번호는 모두 다르다.

 

전화번호부에 중복된 번호는 없다는 특징을 보아, HashMap을 사용하기 적합하다고 생각했다. Key가 중복을 허용하지 않기 때문이다.

전화번호를 Key로 사용하는 HashMap을 만든 다음, 각 전화번호에서 만들 수 있는 접두어를 모두 탐색한다. substring을 사용해서 0번 인덱스부터 마지막 인덱스까지 부분 문자열을 만든 후, HashMap에 존재하는지 검색한다.

 

for(String number : phone_book){
    for(int i = 0; i < number.length(); i++){
        String str = number.substring(0, i);
        if(map.containsKey(str)){
            answer = false;
            break;
        }
    }
}

 

 

전체 코드 (Java)

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        HashMap<String, Integer> map = new HashMap<>();
        for(String number : phone_book){
            map.put(number, 1);
        }
        
        Main:
        for(String number : phone_book){
            for(int i = 0; i < number.length(); i++){
                String str = number.substring(0, i);
                if(map.containsKey(str)){
                    answer = false;
                    break Main;
                }
            }
        }
        
        return answer;
    }
}

 

 

후기

HashMap이 생각보다 응용가능한 점이 많다는 것을 깨달을 수 있는 문제였다.