알고리즘/문제풀기

[프로그래머스] 전화번호 목록 - 해시

hyun_jo_o 2019. 4. 16. 18:34

 

◆ 나의 풀이

compareTo 라는 문자열을 비교해 주는 함수를 만들어서 각 배열의 문자열들을 비교해 주도록 만들었다.

while문 안에서 while(i<numbers.length() && k<compares.length()) 이렇게 되는 이유는 더 작은 길이까지만 비교해 주어도 괜찮기 때문이다. 

아래의 주석 처럼 동작하면 테스트 통과가 된다!

class Solution {
    private static boolean compareTo(String numbers, String compares) {
        int i=0;
        int k=0;
        while (i<numbers.length() && k<compares.length()) {		// 두 문자열보다 길이가 짧을 때까지
            if(numbers.charAt(i) != compares.charAt(k))
                return false;		// 문자열이 다르면 false를 반환
            i++;
            k++;
        }
        return true;		// 문자열이 같으면 true를 반환
    }
    public boolean solution(String[] phone_book) {
        int pblength = phone_book.length;
        for(int i=0; i<pblength; i++) {
            for(int j=i+1; j<pblength; j++) {	// 이미 비교해 준 앞의 배열은 넣어줄 필요가 없어서 j=i+1로 시작해줌
                String phone = phone_book[i];
                String compare = phone_book[j];
                if(compareTo(phone, compare))		// compareTo의 반환값이 true이면
                    return false;				// false를 반환
            }
        }
        return true;	// compareTo의 반환값이 false이면 true를 반환
    }
}

 

 

 

 

◆ 모든 풀이

더욱 간단한 코드가 있었는데 아래의 코드이다.

class Solution {
    public boolean solution(String[] phoneBook) {
       for(int i=0; i<phoneBook.length-1; i++) {
            for(int j=i+1; j<phoneBook.length; j++) {
                if(phoneBook[i].startsWith(phoneBook[j])) {return false;}	
                //phoneBook[i]이 phoneBook[j]로 시작 하면 false를 반환
                if(phoneBook[j].startsWith(phoneBook[i])) {return false;}
                //phoneBook[j]가 phoneBook[i]로 시작 하면 false를 반환
            }
        }
        return true;
    }
}

나는 startsWith라는 함수를 알지 못해서 사용하지 못했다.

 

▽startsWith()

startsWith() 메소드는 문자열이 주어진 접두 표현을 가지고 시작하는지 확인 하는 함수입니다.

만약 주어진 접두표현을 가지고 시작한다면 true를 반환하고, 아니라면 false를 반환합니다.

 

하지만 위 문제에서는  같은 문자열이 있으면 false반환하라고 해서 if문으로 걸고 return을 해준 것 같습니다.