[프로그래머스] 베스트앨범

업데이트:

프로그래머스 베스트앨범 풀이입니다.

이 문제는 나와있는 조건을 잘 확인했어야 했다. (제대로 확인 못해서 뻘짓을 많이 하였다.) 전형적인 해시 문제이다!

조건은 다음과 같다.

  • 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  • 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  • 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

들어오는 장르와 길이들을 우선 같은 장르끼리 묶어서 속한 노래가 많은 장르부터 찾는다.

찾은 뒤 그 장르 내에서 많이 재생된 노래 순으롱 정렬을 시키고 인덱스도 정렬하여 저장시킨다.

솔직히 좀 비효율적으로 코드를 짰다고 생각한다. 조만간 좀 효율적으로 수정해볼까 생각중이다.

Problem : 베스트앨범

Source Code(C++) :

#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

vector<int> solution(vector<string> genres, vector<int> plays) {
	vector<int> answer;

	map<string, int> mp;
	map<string, int>::iterator iter;

	for (int i = 0; i < genres.size(); i++) {
		iter = mp.find(genres[i]);
		if (iter != mp.end()) {
			mp[genres[i]] = iter->second + plays[i];
		}
		else {
			mp.insert({genres[i],plays[i]});
		}
	}

	map<int, string> rev; // 번호순으로 재배치
	map<int, string>::iterator it;

	for (iter = mp.begin(); iter != mp.end(); iter++) {
		rev.insert({-(iter->second),iter->first});
	}

	vector<pair<int, int>> arr;

	for (it = rev.begin(); it != rev.end(); it++) {
		string tmp = it->second;
        arr.clear();
		for (int i = 0; i < genres.size(); i++) {
			if (tmp == genres[i])
				arr.push_back({ -plays[i], i });
		}

		sort(arr.begin(), arr.end());

		if (arr.size() == 1)
			answer.push_back(arr[0].second);
		else {
			answer.push_back(arr[0].second);
			answer.push_back(arr[1].second);
		}	
	}
	return answer;
}

소스코드

이 외에도 제가 푼 문제들 소스코드는 다음 링크에 있습니다!!! 알고리즘 문제풀이

댓글남기기