본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - 전화번호 목록

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때,

어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성

ArrayList<String>[] phone = new ArrayList[10];
for (int i = 0; i < phone.length; i++) {
    phone[i] = new ArrayList<>();
}
for (int i = 0; i < phone_book.length; i++) {
    int numberOfOne = Integer.parseInt(phone_book[i].substring(0, 1));
    phone[numberOfOne].add(phone_book[i]);
}

배열 ArrayList phone에 0~9에 phone_book의 첫 번째 숫자에 따라 구분되어 추가되도록 하였다.

이후 Collections.sort를 하여 숫자를 정리하고

for (int j = 0; j < phone[i].size() - 1; j++) {
    if (phone[i].get(j+1).startsWith(phone[i].get(j))) {
    	return false;
    }
}

startsWith을 이용하여 붙어있는 j+1가 j의 시작 부분인지를 체크하고 true라면 false를 리턴하도록 하였다.

import java.util.ArrayList;
import java.util.Collections;
class Solution {public boolean solution(String[] phone_book) {
        ArrayList<String>[] phone = new ArrayList[10];
        for (int i = 0; i < phone.length; i++) {
            phone[i] = new ArrayList<>();
        }
        for (int i = 0; i < phone_book.length; i++) {
            int numberOfOne = Integer.parseInt(phone_book[i].substring(0, 1));
            phone[numberOfOne].add(phone_book[i]);
        }
        for (int i = 0; i < 10; i++) {
            Collections.sort(phone[i]);
            if (phone[i].isEmpty()) continue;
            else {
                for (int j = 0; j < phone[i].size() - 1; j++) {
                    if (phone[i].get(j+1).startsWith(phone[i].get(j))) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

근데 풀고 나서 보니까 이럴 필요가 있나 싶다.

그냥 sort만 하고 찾아도 나올 것 같긴 하다.

import java.util.Arrays;
class Solution {public boolean solution(String[] phone_book) {
        Arrays.sort(phone_book);
        
        for (int j = 0; j < phone_book.length - 1; j++) {
            if (phone_book[j+1].startsWith(phone_book[j])) {
                return false;
            }
        }
        return true;
    }
}

바로 위의 코드

 

원래 코드

효율성에 차이가 있...나?