티스토리 뷰
프로그래머스 (programmers) 코딩테스트 고득점 Kit 해시 #2 - 전화번호 목록
1. 문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요
2. 제한사항
phone_book의 길이는 1 이상 1,000,000 이하입니다.
각 전화번호의 길이는 1 이상 20 이하입니다.
3. 입출력 예
4. 입출력 예 설명
입출력 예 #1
앞에서 설명한 예와 같습니다.
입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
5. 나의 풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import java.util.Arrays; class Solution { public boolean solution(String[] phone_book) { Arrays.sort(phone_book); for (int i = 0; i < phone_book.length-1; i++) { if (phone_book[i].length() < phone_book[i+1].length()) { if (phone_book[i].equals(phone_book[i+1].substring(0, phone_book[i].length()))) return false; } else { if (phone_book[i+1].equals(phone_book[i].substring(0, phone_book[i+1].length()))) return false; } } return true; } } | cs |
phone_book에는 String 형태의 자료가 들어있으므로 Arrays.sort를 하게되면 사전순으로 배열되어 맨앞자리부터 숫자가 적은 순서로 배열되어 바로 앞의 요소와만 비교를 진행하면 됩니다. 모든 요소의 i번째와 i+1번째 중 길이가 짧은 것이 긴것을 자른것과 같다면 false를 return시키는 방식으로 구현하였습니다.
6. 배운 점
다른 사람들의 풀이를 보니 startsWith() 함수를 사용한 것이 인상깊었습니다. String에 사용하여 앞에 문자열이 포함되는지에따라 true or false를 return하는 함수인데 저의 풀이에서 substring을 굳이 할 필요가 없어지니 앞으로 잘 활용해야겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.util.*; class Solution { public boolean solution(String[] phone_book) { boolean answer = true; HashMap<String, Integer> map = new HashMap<String, Integer>(); for(int inx = 0; inx < phone_book.length; inx++) { for(int jnx = 1; jnx < phone_book[inx].length(); jnx++) { map.put(phone_book[inx].substring(0, jnx), 1); } } for(int inx = 0; inx < phone_book.length; inx++) { if(map.containsKey(phone_book[inx])) { answer = false; break; } else { map.put(phone_book[inx], 1); } } return answer; } } |
또한, Hash 단원이지만 Hash를 어떻게 활용해야할지 감이 안잡혔는데, 위의 풀이처럼 앞 요소부터 차례로 Map에 담고 containsKey를 활용하여 빠른 검색을 통해 true or false를 판단하는 방식으로 진행한 풀이가 있어 인상깊었습니다.
그러나 for문이 여러번 활용되어 복잡도가 높아질 수 있는 단점이 있습니다.
'개발 일지 > 알고리즘 공부' 카테고리의 다른 글
[프로그래머스/코딩테스트 고득점 Kit/스택/큐#2] 프린터 (Java) (2) | 2019.02.03 |
---|---|
[프로그래머스/코딩테스트 고득점 Kit/스택/큐#1] 쇠막대기 (Java) (0) | 2019.01.07 |
[프로그래머스/코딩테스트 고득점 Kit/해시#4] 베스트 앨범 (Java) (0) | 2018.12.19 |
[프로그래머스/코딩테스트 고득점 Kit/해시#3] 위장 (Java) (6) | 2018.12.13 |
[프로그래머스/코딩테스트 고득점 Kit/해시#1] 완주하지 못한 선수 (Java) (2) | 2018.12.10 |