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이 생각보다 응용가능한 점이 많다는 것을 깨달을 수 있는 문제였다.