728x90
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
역시나 HashMap을 이용하여 푸는 문제
HashMap을 하나만 쓰고도 해결할수 있겠지만 그렇게 되면 코드봤을때 깔끔하고 명쾌한 느낌은 아닐것 같아서 HashMap 여러개를 사용하기로 한다.
- 장르1순위 HashMap : (key) 장르이름 + 1 — (value) [노래순번, 재생횟수]
- 장르2순위 HashMap : (key) 장르이름 + 2 — (value) [노래순번, 재생횟수]
- 장르노래재생 HashMap : (key) 장르이름 — (value)장르노래재생수
알고리즘은 대략 아래와 같다.
- 해당 장르 노래 재생 횟수를 추가한다.
- 해당 장르의 1순위와 재생횟수를 비교한다.
- 재생횟수가 1순위보다 크면 현재 1순위는 2순위로 밀려나고 1순위에 현재 노래를 정보를 저장한다.
- 해당 장르 1순위보다 재생횟수가 작으면 2순위와 비교한다.
- 재생횟수가 2순위보다 크면 2순위에 현재 노래정보를 저장한다.
- 노래재생 횟수에 따라 장르를 정렬한다.
- 정렬된 장르의 1순위,2순위를 각 출력한다.
JAVA
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
HashMap<String, Integer[]> gFirst = new HashMap<String, Integer[]>(); //장르별 1위
HashMap<String, Integer[]> gSecond = new HashMap<String, Integer[]>(); //장르별 2위
HashMap<String, Integer> gCount= new HashMap<String, Integer>(); //장르별 재생횟수
for(int i=0; i<genres.length; i++){
//장르별 재생횟수
if(gCount.containsKey(genres[i])){
gCount.put(genres[i], gCount.get(genres[i]) + plays[i]);
}else{
gCount.put(genres[i], plays[i]);
}
Integer[] music = {i, plays[i]};
//장르별 1위 비교
if(gFirst.containsKey(genres[i])){
if(gFirst.get(genres[i])[1] < plays[i]){
gSecond.put(genres[i], gFirst.get(genres[i]));
gFirst.put(genres[i],music);
continue;
}
}else{
gFirst.put(genres[i],music);
continue;
}
//장르별 2위 비교
if(gSecond.containsKey(genres[i])){
if(gSecond.get(genres[i])[1] < plays[i]){
gSecond.put(genres[i],music);
}
}else{
gSecond.put(genres[i],music);
}
}
// 징르 정렬
return answer;
}
}
Python
import operator
def solution(genres, plays):
gFirst = {} #장르별 1위
gSecond = {} #장르별 2위
gCount = {} #장르별 노래 수
answer = []
for i, genre in enumerate(genres) :
# 장르별 노래 count
if genre in gCount:
gCount[genre] += plays[i]
else:
gCount[genre] = plays[i]
if genre in gFirst:
#현재 장르 1위와 비교
if gFirst[genre][1] < plays[i] :
gSecond[genre] = gFirst[genre]
gFirst[genre] = [i, plays[i]]
continue
else:
gFirst[genre] = [ i, plays[i]]
continue
if genre in gSecond:
#현재장르 2위와 비교
if gSecond[genre][1] < plays[i] :
gSecond[genre] = [i, plays[i]]
else:
gSecond[genre] = [i, plays[i]]
#노래많은 장르 정렬
gSorted = sorted(gCount.items(), key=operator.itemgetter(1), reverse = True)
for g in gSorted:
answer.append(gFirst[g[0]][0])
# 노래 1곡인지 check
if g[0] in gSecond :
answer.append(gSecond[g[0]][0])
return answer
728x90
반응형
'알고리즘 > 코드' 카테고리의 다른 글
[코딩테스트 고득점 Kit] 해시 4 - 위장 (0) | 2023.01.05 |
---|---|
[코딩테스트 고득점 Kit] 해시 3 - 전화번호 목록 (0) | 2023.01.04 |
[코딩테스트 고득점 Kit] 해시 2 - 폰켓몬 (0) | 2023.01.03 |
Maximum Subarray - 백준10211, leetcode 53 알고리즘 성능 비교 (0) | 2022.12.14 |
2020 KAKAO BLIND RECRUITMENT 괄호 변환 Python (0) | 2020.11.28 |
댓글