프로그래머스 해시

sua·2023년 2월 15일
0

문제



풀이

import java.util.*;

class Solution {
    public int solution(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        int n = nums.length / 2;
        for(int num : nums) {
            set.add(num); // 중복 제거되며 추가됨
        }
    
        // 중복 제거하고나서 set의 크기가 nums.length / 2보다 크면 nums.length / 2를 리턴 작으면 set의 size를 리턴
        if(set.size() > n) {
            return n;
        } else {
            return set.size();
        }
    }
}

HashSet 자료구조를 이용하여 입력받은 데이터를 HashSet에 추가한뒤 크기를 비교하면 손쉽게 해결할 수 있는 문제다.

결과




문제


풀이

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> map = new HashMap<>();
        
        for(String p : participant) {
            map.put(p, map.getOrDefault(p, 0) + 1);
        }
        
        for(String p : completion) {
            map.put(p, map.get(p) - 1);
        }
        
        for(String p : participant) {
            if(map.get(p) > 0) {
                answer += p;
                map.put(p, map.get(p) - 1);
            }
        }
        
        return answer;
    }
}

HashMap 자료구조를 이용해서 participant에 있는 명단 데이터를 해시맵에 추가시킨다. key값이 있는 경우에는 그값에서 +1해서 put하게 한다. 그런 다음 completion에 있는 데이터를 해시맵에서 -1해준다. 그런다음 participant 명단을 key값으로 해서 해시맵에 값이 0보다 큰 경우 정답값에 key값을 추가시켜주고 그다음 해당 key값의 value를 -1해준다. (중복 없애기 위함)

결과




문제


풀이

import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) {
        Arrays.sort(phone_book);

        // 앞 번호가 뒷 번호의 접두어인지 확인
        for (int i = 0; i < phone_book.length - 1; i++) {
            if(phone_book[i + 1].startsWith(phone_book[i])) {
                return false;
            }
        }
        
        return true;
    }
}

for문을 돌면서 startWith 메소드를 이용해서 뒷번호가 앞번호로 시작하는지 여부를 확인하여 시작한다면 false를 리턴하면 된다.

결과




문제



풀이

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        
        HashMap<String, Integer> map = new HashMap<>();
        for (String[] c : clothes) {
            map.put(c[1], map.getOrDefault(c[1], 0) + 1); // 종류별로 구분
        }

        Iterator<Integer> it = map.values().iterator(); // 반복자 생성
        while(it.hasNext()) {
            answer *= it.next().intValue() + 1; // 입지 않는 경우를 고려하기 위해 +1 해줌
        }
        
        return answer - 1; // 어떤 종류도 입지 않은 경우가 1가지 있기 때문에 -1 해줌
    }
}

결과




문제



풀이

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        ArrayList<Integer> answer = new ArrayList<>();
 
        HashMap<String, Integer> gmap = new HashMap<>(); // 장르별 총 개수
        HashMap<String, HashMap<Integer, Integer>> mmap = new HashMap<>(); // 장르에 속하는 노래와 재생횟수
        for(int i = 0; i < plays.length; i++) {
            if(!gmap.containsKey(genres[i])) { // 장르가 해시맵에 없다면
                HashMap<Integer, Integer> map = new HashMap<>();
                map.put(i, plays[i]); // 고유번호, 재생횟수 저장
                mmap.put(genres[i], map);
                gmap.put(genres[i], plays[i]);
            } else {
                mmap.get(genres[i]).put(i, plays[i]);
                gmap.put(genres[i], gmap.get(genres[i]) + plays[i]);
            }
        }
 
        List<String> keySet = new ArrayList(gmap.keySet());
        Collections.sort(keySet, (s1, s2) -> gmap.get(s2) - (gmap.get(s1))); // 내림차순 정렬
 
        for(String key : keySet) {
            HashMap<Integer, Integer> map = mmap.get(key);
            List<Integer> genre_key = new ArrayList(map.keySet());
 
            Collections.sort(genre_key, (s1, s2) -> map.get(s2) - (map.get(s1))); // 내림차순 정렬
 
            answer.add(genre_key.get(0));
            if(genre_key.size() > 1)
                answer.add(genre_key.get(1));
        }
 
        return answer.stream().mapToInt(i -> i).toArray();
    }
}

결과


profile
가보자고

0개의 댓글

관련 채용 정보