본문 바로가기

기록/알고리즘

[프로그래머스] [Hash] 전화번호 목록

SMALL

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

 


문제 풀이

 

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 + 1].startsWith(phone_book[i])) {
				return false;
			}
		}
		return true;
    }
}

 

일일히 이중 for문 loop를 통해 해결하는 방법도 있지만, 아마 효율성 테스트를 통과하지 못할 것 같다...

"접두어"라는 키워드에 맞춰서 배열을 정렬한 후 앞의 배열 요소가 뒤의 요소의 접두어가 되는지 판단하고, 

(contains가 아닌 startsWith를 사용하는 이유, 그런데 contains로 해도 클리어였다)

접두어인 경우에 바로 return false를 해주었다. 

그 외에 접두어가 아닌 모든 경우에 대해서는 return true를 마지막에 반환한다.

 

문제 유형은 해시인데.. 오히려 복잡해지는것 같고 아이디어가 바로 떠오르지 않았다.


이론 1.  정렬 (Arrays.sort () )

학부때 정렬 알고리즘을 배우면서 구현하는 과정을 통해 일일이 메소드화해서 sort 함수를 구현했었다.

이제는 Java에서 제공하는 Arrays.sort() 메소드를 활용하고 있다.

 

1) 오름차순 정렬

 

// 기본 정렬이다. (작은 요소 -> 큰 요소)

Arrays.sort(arr); 

 

2) 내림차순 정렬

 

// 역순 정렬이다. (큰 요소 -> 작은 요소)

Arrays.sort(arr, Collections.reverseOrder());

 

3) 범위 지정 정렬

 

// 정렬할 범위를 지정해준다.

Arrays.sort(arr, startIndex, endIndex);


이론 2.  contains와 startsWith

contains() 메소드와 startsWith 메소드는 모두 문자열과 관련하여

인자로 전달하는 문자열이 포함되는지 여부를 반환한다. 단, startWith는 맨 앞에 포함되는 지가 조건이다.

메소드 실행 결과를 Boolean type으로 반환한다. 

 

다음은 contains와 startsWith의 사용 예이다.

 

//str1에 str2가 포함되는지 검사한다.

str1.contains(str2);

 

//str1이 str2로 시작하는지 검사한다.

str1.startsWith(str2);

 

+) endsWith 도 있다.

이름에서 알 수 있듯이 전달된 인자의 문자열로 끝나는지 여부를 검사한다.

 

//str1이 str2로 끝나는지 검사한다. 

str1.endsWith(str2);

SMALL