[프로그래머스 고득점 Kit] 전화번호 목록

김가희·2023년 3월 22일
0

PS

목록 보기
3/4

[Hash 3일차] 전화번호 목록

⬇️ 나의 코드 v1 ⬇️(JAVA)

import java.util.Arrays;
import java.util.Collections;

class Solution {
    public boolean solution(String[] phone_book) {

        Arrays.sort(phone_book, Collections.reverseOrder());

        HashSet<String> set = new HashSet<String>();

        for(String s: phone_book) {
            if(set.contains(s)) return false;
            else {
                for(int i = 1; i <= s.length(); i++) {
                    set.add(s.substring(0, i));
                }
            }
        }
        return true;
    }
}

풀이 방식은 먼저 phone_book을 내림차순으로 정렬한다.
정렬의 이유는 길이가 긴것을 앞에 두기 위함이다.

이렇게 정렬한 다음 앞에서 차례대로 set에 그 값이 있는지 비교한다. set에는 지금까지 순회한 문자열의 모든 접두사가 들어있다. 그렇기 때문에 set에 값이 있다면 그 문자의 접두사와 해당 문자가 같다는 것을 의미한다.

만약 set에 값이 없다면 모든 접두사를 넣어주는 for 문을 실행한다.

예를 들면 이렇다.
["119", "97674223", "1195524421"] 의 경우 정렬 하면 =
1195524421,
97674223,
119
순으로 정렬된다.

그럼 1195524421의 경우 set 이 비어있으니 반복문으로 넘어간다.
반복문을 통해 set 에는 1, 11, 119, ~~ ,1195524421 가 들어가게 된다.
97674223도 set 에 없으니 반복문으로 넘어간다.
마지막으로 119 의 경우 앞에서 119를 넣어줬으니 정답은 false 가 나오게 된다.

👀 풀면서 배운것

  1. 자바 정렬 방식 (내가 추천 하는 것)
    a. 람다 방식
    Collections.sort(players, (a, b) -> b.getScore() - a.getScore());
    b. 스트림 형식
    List<Player> sortedPlayers = players.stream()
        .sorted((a, b) -> b.getScore() - a.getScore())
        .collect(Collectors.toList());
  1. string 순회는 Int i 로 chatAt(i) 을 쓴다.

📚 참고 자료

https://yuja-kong.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4-%EC%A0%95%EB%A0%AC-Comparable-Comparator

profile
안드로이드 개발자

0개의 댓글