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

[해시] 전화번호 목록

by AsCE_hyunseung 2018. 10. 10.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;
 
public class phoneNumberList {
    public boolean solution(String[] phone_book) {
 
//        Arrays.sort(phone_book, new Comparator<String>() {//Comparator 구현
//            @Override
//            public int compare(String o1, String o2) {
//                return Integer.compare(o1.length(),o2.length());
//            }
//        });
 
//        Arrays.sort(phone_book, (o1, o2) -> Integer.compare(o1.length(),o2.length()));//람다식 교체
 
        Arrays.sort(phone_book, Comparator.comparingInt(String::length));//Comparator.comparingInt()로 교체
                                                                        // 문자열 길이대로 정렬(짧은 순대로)
        if (checkIncludeString(phone_book)){
            return false;
        }
        return true;
    }
    public boolean checkIncludeString(String[] phone_book) {//제일 짧은 문자열부터 시작해서 뒤의 문자열이 포함하고 있는지 체크
        for (int i=0;i<phone_book.length;i++){
            int len=phone_book[i].length();
            for(int j=i+1;j<phone_book.length;j++){
                if(phone_book[j].substring(0,len).equals(phone_book[i])){//체크 부분
                    return true;
                }
            }
        }
        return false;
    }
}
 
cs

phoneNumberList.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.junit.Test;
import static org.junit.Assert.*;
 
public class phoneNumberListTest {
    phoneNumberList p=new phoneNumberList();
    String []s1={"119","97674223","1195524421"};
    String []s2={"123","456","789"};
    String []s3={"12","123","1235","567","88"};
 
    @Test
    public void 테스트_결과() {
        assertEquals(false,p.solution(s1));
        assertEquals(true,p.solution(s2));
        assertEquals(false,p.solution(s3));
    }
}
cs

phoneNumberListTest.java


 - 문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.

전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.


구조대 : 119

박준영 : 97 674 223

지영석 : 11 9552 4421

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


 - 제한 사항

phone_book의 길이는 1 이상 1,000,000 이하입니다.

각 전화번호의 길이는 1 이상 20 이하입니다.


 - 입출력 예제

phone_book                 return

[119, 97674223, 1195524421] false

[123,456,789]                 true

[12,123,1235,567,88]              false


27번 라인에서 비교할때 처음에 ==를 써서 원하는 정답이 안나왔다. 생각해보다가 인텔리제이에서 보내는 경고표시를 보고 깨닫고 equal()로 바꿨다.

문제 주제가 해시인데 해시를 어떤식으로 적용해야할지 판단이 안섰다. 나중에 다시 한번 풀어봐야겠다.



1
2
3
4
5
6
Arrays.sort(phone_book, new Comparator<String>() {//Comparator 구현
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(),o2.length());
            }
        });
cs

문자열 길이별, 사전순 정렬하는 메소드이다.

인텔리제이에서 자동으로 람다식으로 변환해주었다.


1
Arrays.sort(phone_book, (o1, o2) -> Integer.compare(o1.length(),o2.length()));//람다식 교체
cs


1
Arrays.sort(phone_book, Comparator.comparingInt(String::length));//Comparator.comparingInt()로 교체
cs

확실히 인텔리제이가 편리한 기능들이 많이 있는 툴인 것을 다시 한번 깨닫게 되었다.


---------------------------------------------------------------------------------------------------------------------------------------------------------------------

다른 사람의 풀이를 봤는데 startsWith()라는 메소드가 있었다(...) 좀 더 찾아볼걸 그랬다.


1
boolean startsWith(String prefix)
cs

비교 대상 문자열이 입력된 문자열(prefix)값으로 시작되는지 여부를 확인하고 boolean 값으로 리턴한다.


반대로 끝이 어떻게 끝나는지 체크하는 메소드도 있었다.

1
boolean endsWith(String suffix)

cs


문자열 관련 문제풀 때 활용 용도가 높을 것 같아서 기억하고 있어야겠다.

'프로그래머스 > JAVA' 카테고리의 다른 글

[level 2] 124 나라의 숫자  (0) 2018.10.17
[해시] 위장  (0) 2018.10.12
[정렬] H-Index  (0) 2018.10.05
[해시] 완주하지 못한 선수  (2) 2018.10.04
[level 2] JadenCase 만들기  (4) 2018.09.30