1. 신고 결과 받기
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
한 유저를 여러 번 신고해도 동일한 유저에 대한 신고 횟수가 1회로 처리되는 조건, 즉 중복이 허용 되지 않는다.
따라서 HashMap+HashSet 사용한 문제
import java.util.*;
class Solution {
public int[] solution(String[] idList, String[] report, int k){
int num = idList.length;
int[] answer = new int[num];
HashMap<String, HashSet<String>> map = new HashMap<>(); //정보 매핑
HashMap<String, Integer> result = new HashMap<>(); //카운팅 해줌
HashSet<String> userSet = new HashSet<>(Arrays.asList(report));
for(String user: userSet) {
String splited[] = user.split(" ");
String id = splited[0];
String reported = splited[1];
map.putIfAbsent(id, new HashSet<String>() {
{ add(reported); }
});
map.get(id).add(reported);
result.put(reported, result.getOrDefault(reported, 0)+1);
}
for(String who: result.keySet()) {
int howmany = result.get(who);
if(howmany >= k) {
for(int i = 0; i < num; i++) {
if(map.containsKey(idList[i]) && map.get(idList[i]).contains(who))
answer[i]++;
}
}
}
return answer;
}
}
2. 베스트앨범
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
HashMap과 우선순위 큐를 함께 사용한 문제.
많이 재생된 노래, 고유 번호가 낮은 노래 등 우선순위를 따지는 조건이 다수였다.
처음에 HashMap과 Set을 사용해서 접근해 보았지만 인덱스나 재생 수를 비교하는 과정에서 불필요한 시간이 많이 소요될 뿐만 아니라 코드도 복잡해지길래 우선순위 큐를 사용하는 편이 빠르다고 생각했다.
HashMap에 우선순위 큐를 중첩해서 사용해 본건 처음이여서 낯설었지만 기억해 두면 유용하게 쓸 수 있을 것 같다.
import java.util.*;
import java.io.*;
class Song {
int index;
int playCount;
public Song(int index, int playCount) {
this.index = index;
this.playCount = playCount;
}
}
class Solution {
public int[] solution(String[] genres, int[] plays) {
// 각 장르와 노래 정보<인덱스, 재생수>를 저장하는 우선순위 큐 선언
HashMap<String, PriorityQueue<Song>> info = new HashMap<>();
// 각 장르별 총 재생 횟수를 저장해줌.
HashMap<String, Integer> totalPlays = new HashMap<>();
int num = plays.length;
// 각 장르별로 재생 횟수를 더해준다
for (int i = 0; i < num; i++) {
String genre = genres[i];
int playCount = plays[i];
totalPlays.put(genre, totalPlays.getOrDefault(genre, 0) + playCount);
}
// 각 장르별로 재생 횟수가 많은 노래의 인덱스를 저장
for (int i = 0; i < num; i++) {
String genre = genres[i];
int playCount = plays[i];
if (!info.containsKey(genre)) {
info.put(genre, new PriorityQueue<>((a, b) -> {
if (a.playCount != b.playCount) {
return b.playCount - a.playCount; //재생수 높은 순서대로
} else {
return a.index - b.index; // 재생수가 같으면 인덱스(고유번호가) 낮은 노래가 먼저
}
}));
}
/*
각 장르에 해당하는 노래를 저장하는 우선순위 큐를 가져오자.
info.get(genre) - 주어진 genre에 해당하는 우선순위 큐를 반환
*/
PriorityQueue<Song> songQueue = info.get(genre);
songQueue.offer(new Song(i, playCount)); //우선순위 큐에 노래 정보를 offer 해준다.
}
// 재생 횟수가 많은 장르부터 노래를 수록하여 answer 리스트에 저장
ArrayList<Integer> answerList = new ArrayList<>();
List<Map.Entry<String, Integer>> sortedGenres = new ArrayList<>(totalPlays.entrySet());
Collections.sort(sortedGenres, (a, b) -> b.getValue() - a.getValue());
for (Map.Entry<String, Integer> entry : sortedGenres) {
String genre = entry.getKey();
PriorityQueue<Song> songQueue = info.get(genre);
int count = Math.min(songQueue.size(), 2);
for (int i = 0; i < count; i++) {
answerList.add(songQueue.poll().index);
}
}
int[] answer = new int[answerList.size()];
for (int i = 0; i < answerList.size(); i++) {
answer[i] = answerList.get(i);
}
return answer;
}
}
'Algorithms > programmers' 카테고리의 다른 글
[Hash] Lv.1 폰켓몬, 완주하지 못한 선수 (0) | 2024.03.04 |
---|---|
[Binary Search Tree] 길 찾기 게임 (0) | 2024.02.29 |
[이분탐색] 징검다리 건너기 (0) | 2024.01.23 |
[이분탐색] 프로그래머스 입국심사 (0) | 2024.01.11 |
[Greedy] 프로그래머스 체육복, 큰 수 만들기, 구명보트, 단속카메라 (1) | 2023.12.28 |