본문 바로가기

ALGORITHM

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

배열의 요소 중 하나가 다른 요소의 접두어인지 확인하는 문제

String 클래스의 startsWith(), endsWith()와 같은 것을 생각할 수 있다.

번외로 indexOf()나 contains()로 풀이한 것도 있으니 문자열 관련 내용이 나오면 이와 같은 메서드를 활용해보자.

 

+ 해시를 이용한 문제이니 나중에 꼭 해시로 풀어보자.

 

public class Ex2 {
	
	public static void main(String[] args) {
	
		String[] phone_book = { "123", "456", "789" };
		
		System.out.println(solution(phone_book));
		
	}
	
	public static boolean solution(String[] phone_book) {
		
		boolean answer = true;
		
		for(int i = 0; i < phone_book.length - 1; i++) { // 비교할 기준이므로 마지막 요소는 빼기
			
			for(int j = i + 1; j < phone_book.length; j++) { // 비교할 대상이므로 두 번째 요소부터 비교
				
				if(phone_book[i].startsWith(phone_book[j])) { // 순차적 비교
					return false;
				}
				if(phone_book[j].startsWith(phone_book[i])) { // 거꾸로도 비교
					return false;
				}
				
			}
		}
		
		return answer;
		
	}

}

 

아래 예시는 정렬을 먼저 하고 한 번만 비교를 했다는 점에서 위와 다르다.

 

import java.util.Arrays;

public class Ex2_1 {
	
	public static void main(String[] args) {
	
		String[] phone_book = { "123", "456", "789" };
		
		System.out.println(solution(phone_book));
		
	}
	
	public static boolean solution(String[] phone_book) {
		
		boolean answer = true;
		
		// 오름차순으로 정렬
		// sort하면 가장 큰 수가 뒤로 가므로 뒤에 숫자로부터 앞의 숫자가 시작하는지 확인할 필요가 없음
		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 answer;
		
	}

}