본문 바로가기
문제풀이/프로그래머스

전화번호 목록 / 프로그래머스 연습문제 / programmers / level2 / java

by RUCKUS 2021. 5. 5.

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

 

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

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

programmers.co.kr

나의 첫 Level 2 문제!

비슷한 거 같으면서도 역시나 쉽지는 않았다.

 

이번 문제는 해시에 대하여 잘 알아야 한다고 하는데, 

라고 설명하고 있다.

 

그리하여 나는 for문을 이용하여 배열의 [i] 값을 key값이라고 가정하고 그에 맞는 value값을 [i+1]로 지정하여 비교해주면서 코딩을 하였다.

 

처음에는 substring 메소드를 사용하여 작성하였는데, 정확성은 100%였지만 효율성에서 계속 문제가 틀렸다. 처리속도를 빠르게 해주는 부분을 계속 고민해보다가 startWith라는 함수를 사용해보았는데, 코딩만 편하지 그대로였다.

 

계속 고민을 해보다 보니 내 코드에는 쓸데없는 부분이 발견되었는데, 그건 이중 포문을 돌리는데 서로 일일이 모두 다 비교하기 때문에 비교해야 하는 배열이 커질수록 처리속도도 느려진다는 점이었다.

 

하여 Arrays.sort메서드를 이용하여 오름차순으로 정렬 해준 후에 해당 배열과 그 배열의 다음 값만을 비교해주고 false가 나올 시 즉각 break를 걸어서 최대한 빠르게 함수가 마무리되게 끔 작성하였다.

 

public class phoneNumList {

	public static void main(String[] args) {
		String[] phone_book = {"119", "97674223", "1195524421"};
		solution(phone_book);
	}
	
	public static boolean solution(String[] phone_book) {
        
        boolean answer = true;
        
        Arrays.sort(phone_book);
        // 숫자 오름차순으로 배열 정렬
        System.out.println(Arrays.toString(phone_book));
        for (int i = 0; i < phone_book.length-1; i++) {
        	// 배열의 길이 -1 만큼 for문 반복
        	if(phone_book[i+1].startsWith(phone_book[i])) {
        		// i+1이 i의 값을 포함한다면 false 리턴하기
        		answer = false;
				break;
        	}  	
		}
        System.out.println(answer); 
        return answer;
    }
	
}

 

HashSet, List, Map

과 같은 메소드를 사용하시는 분들도 다수계셨으나 거의 300명 이상 나와 비슷하게 풀었기에 의도를 파악하고 잘 풀었다고 가정해본다....


[깃허브]

https://github.com/RUCKUSJERRY/practiceOfJava/blob/main/Prs_Pratice/src/com/level02/phoneNumList.java

 

RUCKUSJERRY/practiceOfJava

Contribute to RUCKUSJERRY/practiceOfJava development by creating an account on GitHub.

github.com