본문 바로가기

기초 공부/코딩테스트 연습

[코딩테스트 #4] 전화번호 목록(해시) level2 - java

728x90

네번째 코딩테스트 시간입니다.

 

이번엔 level 2에 대한 두려움을 가지고 시작했지만 생각보다 어렵지 않았습니다.

 

문제는

 

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

 

코딩테스트 연습 - 전화번호 목록 | 프로그래머스

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조대 : 119 박준영 : 97 674 223 지영석 : 11 9552 4421 전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 r

programmers.co.kr

요거 였습니다.

 

간략하게 문제를 요약하자면 

 

전화번호 목록중 특정 전화번호가 다른 전화번호의 접두사(앞부분)인지 확인하는 문제였습니다.

 

처음에 생각한 방법은 문제를 제대로 확인 안하고 전화번호 배열이 숫자인줄 알았기때문에

 

log 등의 메소드를 써서 자릿수 비교를 통해 해결하려했습니다.

 

다시 문제를 보니 String 형태였고 substring으로 해결할 수 있을거라 생각했습니다.

 

처음 배열을 sort메소드를 사용해 정렬한 후 

 

2중 for문으로 들어가 비교를 시작 이 때 비교문 작성은 생각보다 쉬웠습니다.

 

앞에꺼 만큼의 길이만큼 잘라서 확인하면되었으니까요

 

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;

        Arrays.sort(phone_book);
        
        for(int i = 0; i < phone_book.length; i++){
            
            for(int j = i+1; j < phone_book.length; j++){
                try{
                    if(phone_book[i].equals(phone_book[j].substring(0,phone_book[i].length()))){
                        return false;
                    }
                } catch (StringIndexOutOfBoundsException e){
                    
                }
    
            }        
        }
        
        return answer;
    }
}

 

try catch 는 배열 비교 중에 String substring 중 인덱스 에러를 잡기 위해 넣었습니다.

 

 

뿌듯

 

결과는 한번에 통과 특이하게도 이번엔 효율성에 걸리지 않았다.

 

다른사람의 코드를 보니 startswith 라는 자바 메소드를 썼던데 처음보는 메소드라 신기했다.

 

이 메소드는 간단하게 해당 문자가 비교 문자의 앞에 시작하냐 아니냐를 묻는 메소드다.

예를 들면 

'abc' 는 'abcdef' 의 앞으로 시작하기 때문에 true를 반환한다.

'a'도 마찬가지다

'b'는 false를 반환한다.

 

근데 문제는 해시 문젠데 해시로 푼 결과가 없다.

 

참 난감하다

반응형