[프로그래머스 고득점Kit] 0808 - Hash

HyeJi9908·2022년 8월 9일
0

[JAVA] 프로그래머스

목록 보기
10/11

🔎 개념

String.subString()

  1. subString(int startIdx)
    : startIdx부터 문자열 끝까지의 문자열 가져오기
  2. subString(int startIdx, int endIdx)
    : startIdx부터 endIdx까지의 문자열 가져오기

이차원 HashMap초기화

			if(musicMap.containsKey(genres[i])) 
				musicMap.get(genres[i]).put(i, plays[i]);			
			else {
				HashMap<Integer,Integer> map = new HashMap<>();
				map.put(i, plays[i]);
				musicMap.put(genres[i], map);
			}

HashMap 내림차순

		// playTimeMap의 key들을 리스트로 만들어 누적횟수 내림차순으로 정렬
		List<String> keySet = new ArrayList(playTimeMap.keySet());
		Collections.sort(keySet,(a,b) -> playTimeMap.get(b) - playTimeMap.get(a));

ArrayList를 int 배열로 반환

return answer.stream().mapToInt(i->i).toArray();

📚 폰켓몬 - lv1

import java.util.HashSet;

public class Hash0808_1 {
	public int solution(int[] nums) {
		
		int answer = nums.length/2;
		
		HashSet<Integer> set = new HashSet<Integer>();
		for(int i:nums) set.add(i);
		
		if(set.size()>answer) 
			return answer;
			
		return set.size();
	}
}

📚 완주하지 못한 선수 - lv1

import java.util.HashMap;

public class Hash0808_2 {
	public String solution(String[] participant,String[] completion) {
		String answer ="";
		
		HashMap<String,Integer> map = new HashMap<>();
		
		// 초기화
		for(String c:participant)
			map.put(c, map.getOrDefault(c, 0)+1);
		
		for(String c:completion)
			map.put(c, map.get(c)-1);
		
		for(String key:map.keySet()) {
			if(map.get(key)>0)
				answer=key;
		}
		
		return answer;
	}
}

📚 전화번호 목록 - lv2

import java.util.HashMap;

public class Hash0808_3 {
	public boolean solution(String[] phone_book) {
		
		HashMap<String,Integer> map = new HashMap<>();
		for(String s:phone_book)
			map.put(s, 0);
		
		for(String str:phone_book) {
			for(int j=1;j<str.length();j++) {
				String subStr = str.substring(0,j);
				if(map.containsKey(subStr))
					return false;
			}
				
		}
		
		return true;
	}
}

📚 위장 - lv2


import java.util.HashMap;

public class Hash0808_4 {
	public int solution(String[][] clothes) {
		
		HashMap<String,Integer> map = new HashMap<>();
		
		for(String[] clothe:clothes)
			map.put(clothe[1], map.getOrDefault(clothe[1], 0)+1);
		
		int answer=1;
		for(String key:map.keySet())
			answer*=map.get(key)+1;
		
		return answer-1;
	}
}

📚 베스트 앨범 - lv3

HashMap 활용

import java.util.*;

public class Hash0808_5 {
	public int[] solution(String[] genres,int[] plays) {
		
		// (장르, 누적횟수)
		HashMap<String,Integer> playTimeMap = new HashMap<>();
		
		// (장르, (인덱스, 해당 횟수))
		HashMap<String,HashMap<Integer,Integer>> musicMap = new HashMap<>();
		
		// 각 HashMap 초기화
		for(int i=0;i<genres.length;i++) {
			
			// musicMap 초기화
			if(musicMap.containsKey(genres[i])) 
				musicMap.get(genres[i]).put(i, plays[i]);			
			else {
				HashMap<Integer,Integer> map = new HashMap<>();
				map.put(i, plays[i]);
				musicMap.put(genres[i], map);
			}
			
			// playTimeMap 초기화
			playTimeMap.put(genres[i], playTimeMap.getOrDefault(genres[i], 0)+plays[i]);
		}
		
		ArrayList<Integer> answer = new ArrayList<>();
		
		// playTimeMap의 key들을 리스트로 만들어 누적횟수 내림차순으로 정렬
		List<String> keySet = new ArrayList(playTimeMap.keySet());
		Collections.sort(keySet,(a,b) -> playTimeMap.get(b) - playTimeMap.get(a));
		
		// 같은 장르내에서 플레이 횟수 내림차순 정렬 
		for(String key:keySet) {
			
			HashMap<Integer,Integer> map = musicMap.get(key);
			List<Integer> mapKey = new ArrayList(map.keySet());
			Collections.sort(mapKey,(a,b) -> map.get(b) - map.get(a));
			
			// 각 장르별로 가장 큰것 2개까지만 담기
			answer.add(mapKey.get(0)); // 가장 큰 것
			if(mapKey.size()>1)
				answer.add(mapKey.get(1)); // 두번째 큰 것
		}
		
		// ArrayList를 int배열로 리턴
		return answer.stream().mapToInt(i->i).toArray();
	}
}

class 활용

: 같은 장르내에서 재생횟수가 많은 순으로하되 같으면 오름차순으로 정렬 >> 이 부분을 클래스를 이용해 구현

import java.util.*;

public class 베스트앨범 {

    public static class Music implements Comparable<Music>{
        String genre;
        int idx;
        int cnt;

        public Music(String genre, int idx, int cnt){
            this.genre = genre;
            this.idx = idx;
            this.cnt = cnt;
        }

        @Override
        public int compareTo(Music o) {
            int result = o.cnt - this.cnt;
            if(result == 0)
                result = this.idx - o.idx;

            return result;
        }
    }
    public static int[] solution(String[] genres, int[] plays) {
        int[] answer;

        // 장르별 재생 순 저장
        Map<String, Integer> cntByGenre = new HashMap<>();
        for(int i = 0 ; i < genres.length ; i++){
            cntByGenre.put(genres[i], cntByGenre.getOrDefault(genres[i], 0) + plays[i]);
        }

        // 재생 횟수가 많은 순으로 장르 정렬
        List<String> listKeySet = new ArrayList<>(cntByGenre.keySet());
        Collections.sort(listKeySet, (value1, value2) -> (cntByGenre.get(value2).compareTo(cntByGenre.get(value1))));

        // 각 장르에서 1개 or 2개 고르기
        ArrayList<Music> bestAlbum = new ArrayList<>();
        for(String genre : listKeySet){
            ArrayList<Music> list = new ArrayList<>();

            for(int i = 0 ; i < genres.length ; i++){
                if(genre.equals(genres[i])){
                    list.add(new Music(genres[i], i, plays[i]));
                }
            }

            // 재생 횟수가 많은 순으로, 같으면 번호가 낮은 순으로 정렬
            Collections.sort(list);
            bestAlbum.add(list.get(0));

            if(list.size() > 1){
                bestAlbum.add(list.get(1));
            }
        }
        
        answer = new int[bestAlbum.size()];
        for(int i = 0 ; i < bestAlbum.size() ; i++){
            answer[i] = bestAlbum.get(i).idx;
        }
        
        return answer;
    }
    
    public static void main(String[] args) {
        String[] genres = {"classic", "pop", "classic", "classic", "pop"};
        int[] plays = {500, 600, 150, 800, 2500};
        int[] answer = solution(genres, plays);

        for(int a : answer){
            System.out.println(a);
        }
    }
}

0개의 댓글