Hash(2)

배지원·2022년 10월 29일
0

알고리즘

목록 보기
8/16

프로그래머스
문제1 : https://school.programmers.co.kr/learn/courses/30/lessons/1845
문제2 : https://school.programmers.co.kr/learn/courses/30/lessons/42577

문제1

  • 주어진 폰켓몬의 절반을 가져갈수 있는데 이때 가져갈수 있는 폰켓몬 수에서 중복되지 않게 폰켓몬을 가져갈수 있는 최대의 경우의 수를 구하여라
    ex) 만약 {1,2,3,3}처럼 1번 폰켓몬 : 1마리, 2번 폰켓몬 : 1마리, 3번 폰켓몬 : 2마리가 주어졌을때 4/2 = 2 즉, 총 2마리를 데려갈수 있다. 이때 중복되지 않게 데려갈수 있는 경우의 수는 [1,2], [2,3], [1,3] 으로 서로 다른 폰켓몬 2마리씩은 데려갈 수 있으므로 2가 출력이 된다. {1,1,1,3,3,3}일 경우 데려갈 수 있는 폰켓몬은 6/2 = 3 총 3마리이나, 서로 다른 폰켓몬은 [1,3]으로 최대 2마리를 데려갈 수 있으므로 2가 출력이 된다.

분석

  1. 폰켓몬의 종류가 담긴 배열이 주어짐
  2. 가져갈 수 있는 폰켓몬의 개수를 구함
  3. 중복값 제거
  4. 다른종류의 폰켓몬을 고를 수 있는 횟수의 최댓값을 구함

CODE

public class Pokemon {
    public int choosemax(int[] nums){
        int count = (nums.length)/2;     // 선택할 수 있는 폰켓몬 수
        
        Set<Integer> set = new HashSet<>();
        
        for(int num:nums){  // nums의 배열을 1개씩 set에 넣어줌
                            // set의 특성을 활용해 중복 제거
            set.add(num);
        }

        int answer = (set.size()>count)? count:set.size();
        // set의 크기가 count보다 클경우 count 출력, 작을경우 set 원소개수 출력

        return answer;
    }

    public static void main(String[] args) {
        Pokemon p = new Pokemon();
        int result1 = p.choosemax(new int[]{3,1,2,3});
        int result2 = p.choosemax(new int[]{3,3,3,2,2,4});
        int result3 = p.choosemax(new int[]{3,3,3,2,2,2});

        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
    }
}


문제2

  • 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하는 문제
    예). ["123","456","789"]가 입력되었을때 접두어가 없으므로 true 반환
    ["12","123","1235","567","88"] 입력시 "12"는 "123"의 접두어이므로 false 반환

분석

  • 전화번호부 배열을 set에 저장한다.
  • set을 containes를 사용하여 글자를 가지고 있는지 확인한다.
    (존재하면 false, 존재하지 않으면 true)
    이때, 비교를 할때 길이가 긴 값을 기준 값을 substring으로 잘라서 찾는다
    ex) [1,2,3],[1,2,3,5] 가 주어졌을때 substring을 통해 자신의 길이보다 -1하여 자기 자신값이 존재하여 반환하는 것을 방지하고 set에 해당값이 있는지 찾는다 [1,2,3]일 경우 0~1까지 즉, [1,2]까지 값을 찾아 자기자신값을 찾는것을 방지하고 나머지 값과 비교하여 true 반환한다. 그 후, [1,2,3,5]일 경우 0~2까지 즉, [1,2,3]까지 값을 찾아 set에 저장된 값과 비교하여 이미 값이 존재하므로 접두어이므로 false를 반환한다.

CODE

public class CallBook {
    public Boolean solution(String[] phone_book){
        Set<String> set= new HashSet<>();

        for(String phone : phone_book)
            set.add(phone);         // HashSet에 저장

        for(int i=0; i<set.size(); i++){        // startWith() 메서드를 사용해서 비교할 수도 있음
            System.out.println("길이 : "+phone_book[i].length());
            for(int j =0; j< phone_book[i].length(); j++){
                if(set.contains(phone_book[i].substring(0,j)))      // 길이가 긴 값에서 값을 잘라 해당 값이 존재하는지 찾는다
                                    // ex) (1) =[12], (2) =[123]일때
                    // (1)에서는 0~1 즉, [1]만 출력하여 자기 자신값으로 인해 false를 출력하는 것을 방지한다.
                    // (2)에서는 0~2 즉, [12]를 출력하여 (1)과 비교하여 접두어이므로 false를 반환한다.
                   
                    return false;


                System.out.println(phone_book[i].substring(0,j));
            }
        }


        return true;
    }

    public static void main(String[] args) {
        CallBook cb = new CallBook();
        Boolean result1 =  cb.solution(new String[]{"119","97674223","1195524421"});
        Boolean result2 =  cb.solution(new String[]{"123","456","789"});
        Boolean result3 =  cb.solution(new String[]{"12","123","1235","567","88"});

        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
    }
}
profile
Web Developer

0개의 댓글