프로그래머스 전화번호 목록
위 문제는 String 배열인 phone_book을 주는데
배열 중 하나의 인덱스가
다른 인덱스의 접두어인 경우에는
false를 반환하고 그 외에는 true를 반환한다
여기서 접두어가 뭔 말이냐면
119 / 97674223 / 1195524421 가 있을 때
1195524421 앞에 119가 있는 것이 보이는데
배열 안에 119가 존재하기 때문에
한 번호가 다른 번호의 접두어라고
보고 false를 반환하면 된다
유의할 점은 대량의 데이터를 가지고
조회를 수행할 경우 startsWith / equals 등은
속도가 느리기 때문에(효율성에서 걸림)
해시를 이용한 방법으로 문제를 풀어줘야 한다
문제풀이는 HashSet 안에 배열 데이터를 담아준 뒤
for 문을 두번 돌리는 것으로
깔끔하게 해결할 수 있는데
먼저 set 크기만큼 for 문을 돌려주면서
set의 값 하나씩 꺼내준 뒤
다시 해당 값의 length로 for 문을 돌리면서
set에 contains가 되어있는지 확인하는 것인데
길이가 긴 값을 한글자씩 분해하면서
자른 값이 자기가 아니면서(hashCode)
(equals를 쓰지 않는 이유는 효율성 때문)
set 안에 contains 되어 있다면
해당 값이 지금 for 돌리고 있는 값의
접두어로 사용되고 있기 때문에
바로 return false를 해주고
그 외에는 접두어가 없기 때문에
true를 return 시켜주면 된다
이 이중 for 문의 핵심은 큰 값을 분해하면서
작은 값이 접두어에 해당되는지를
contains로 찾아주면 된다
마지막으로 답안에 사용한 코드는 아래와 같다
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
boolean answer = true;
HashSet<String> set = new HashSet<>(Arrays.asList(phone_book));
for(String val : set) {
for(int i = 1; i<=val.length(); i++) {
// set의 값을 가지고 for 문을 돌리면서 접두어에 해당되는 값 찾기(contains)
// 본인이 본인의 접두어가 되는 경우는 제외처리(hashcode)
if(set.contains(val.substring(0, i)) && val.substring(0, i).hashCode() != val.hashCode()) {
return false;
}
}
}
return answer;
}
}
'Language > 알고리즘 문제풀이' 카테고리의 다른 글
프로그래머스 순열 검사 자바 문제풀이 (0) | 2021.11.17 |
---|---|
프로그래머스 완주하지 못한 선수 자바 문제풀이 (0) | 2021.10.28 |
프로그래머스 피보나치 수(Java) (0) | 2019.10.16 |
프로그래머스 짝지어 제거하기(Java) (0) | 2019.10.16 |
프로그래머스 N개의 최소공배수(Java) (0) | 2019.09.29 |
댓글