[알고리즘] 전화번호 목록

2023. 4. 6. 01:15·개발 공부/알고리즘

문제

문제 링크

풀이

예를 들어 phone_book 배열이 ["12","123","1235","567","88"] 처럼 주어졌을 때 1235에 12가 포함되므로 접두사가 되며 false가 정답이 된다. 이를 단순하게 확인하려면 모든 원소에 대하여 모든 다른 원소와 비교하면 문제는 해결되지만 시간복잡도가 O(n^2)이 되어 효율성 테스트에서 오답이 나오게 된다.

O(n)에 문제를 해결하려면 한번만 순회하면서 답을 찾아야 한다. 이를 위해서는 각각의 자릿수에 대하여 더 작은 수가 앞에 오도록 정렬을 해주면 된다. 예를 들어 "12"와 "123" 이 있다면 "12", "123"으로 정렬을 해야 하고 "1"과 "123" 이 있다면 "1", "123"으로, "2"와 "24"와 "134"이 있다면 "134", "2", "24"로 정렬을 수행해야 한다. 이렇게 하면, 바로 직전의 수가 다음 수에 포함되는지 확인하는 것만으로 전체 수간에 접두사 관계가 존재하는지를 확인할 수 있게 된다.

맨 앞에 "1" 이 있고 한참 뒤에 있는 "123"의 경우 맨 앞의 "1"이 접두사로 인식되지 못하는 것 아닌가? 하는 생각이 들었지만 생각해보면 "1"과 "123" 사이에 아무런 숫자가 없다면 붙어있으므로 당연히 접두사로 인식될 것이고, 사이에 숫자가 있다면 무조건 "1"을 포함하는 숫자일 것이므로 이러한 문제는 발생하지 않는다.

자바에서 문자열로 이루어진 배열을 정렬하면 앞서 말한 것처럼 정렬을 수행해준다. 따라서 정렬을 수행한 후 String 클래스의 startsWith() 메서드를 통해 현재 문자열이 직전의 문자열로 시작되는지를 확인하면 된다.

전체 코드는 아래와 같다.

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        // "1", "1xx", "1xxx", "2", "24", "59", "599", ...
        Arrays.sort(phone_book);       

        for (int i = 1 ; i < phone_book.length ; i++) {
            // 현재 문자열이 직전 문자열로 시작하는지 확인
            if (phone_book[i].startsWith(phone_book[i - 1])) {
                return false;
            }
        }
        // 접두사 관계가 없다면 true 반환
        return true;
    }
}

'개발 공부 > 알고리즘' 카테고리의 다른 글

[알고리즘 - 그리디] 무지의 먹방 라이브  (0) 2023.06.09
[알고리즘 - 완전탐색] 전력망을 둘로 나누기  (0) 2023.04.13
[알고리즘 - 그래프] 다익스트라 - 가장 먼 노드  (0) 2023.03.30
[알고리즘 - graph] 네트워크  (0) 2023.03.23
[알고리즘] graph와 탐색  (0) 2023.03.21
'개발 공부/알고리즘' 카테고리의 다른 글
  • [알고리즘 - 그리디] 무지의 먹방 라이브
  • [알고리즘 - 완전탐색] 전력망을 둘로 나누기
  • [알고리즘 - 그래프] 다익스트라 - 가장 먼 노드
  • [알고리즘 - graph] 네트워크
gmelon
gmelon
백엔드 개발을 공부하고 있습니다.
  • gmelon
    gmelon's greenhouse
    gmelon
  • 전체
    오늘
    어제
    • 분류 전체보기 (91)
      • 개발 공부 (28)
        • Java (6)
        • Spring (10)
        • 알고리즘 (11)
        • 기타 (1)
      • 프로젝트 (12)
        • [앱] 플랭고 (4)
        • 졸업 프로젝트 (8)
      • 스터디 (0)
        • 자바 (30)
      • 기록 (15)
        • 후기, 회고 (9)
        • SSAFYcial (5)
        • 이것저것 (1)
      • etc. (6)
        • 모각코 (6)
  • 블로그 메뉴

    • 홈
    • 방명록
    • github
    • 스크랩
  • 인기 글

  • 태그

    태초마을이야
    한글프로그래밍언어
    싸피 회고
    자바 Collector
    2024 상반기 회고
    groupingBy()
    2024 회고
    java
    Collector groupingBy()
    자바
    Java Collector
    졸업프로젝트
    groupingBy mapping
    AWS 프리티어 종료
    프리티어 종료
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
gmelon
[알고리즘] 전화번호 목록
상단으로

티스토리툴바