유명한 국내 코딩 문제 사이트로는 백준, 프로그래머스가 있습니다.
우선 1차 목표로 프로그래머스의 코딩테스트 문제들을 풀어볼 예정입니다.
코딩테스트 # 해시 문제 4번
장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 만들어라.
주어지는 데이터 : genres[], plays[]
genres[] : i번째 노래의 장르
plays[] : i번째 노래의 play 수
규칙
1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
* 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.
#문제풀이
→ 필요한 것 : 장르별 재생횟수 및 순서, 장르 내 재생횟수가 많은 순서
주어진 데이터(genres[], plays[])는 Direct Addressing Table 방식으로 정리되어 있다.
ex) genres = ["classic", "pop", "classic", "classic", "pop"] plays = [500, 600, 150, 800, 2500]
1. 장르 종류를 파악하여 이를 저장하는 배열을 만든다.
→ ex) ['classic', 'pop']
-classic은 0번, pop은 1번으로 활용한다.
2. 장르별로 배열을 만든 뒤, 각 장르 배열에 [곡 번호, 재생 횟수]를 저장한다.
→ ex) [[[0, 500], [2, 150], [3, 800]], [[1, 600], [4, 2500]]]
classic을 뜻하는 0번째 배열에는 3개 곡의 [곡 번호, 재생 횟수]가, pop을 뜻하는 1번째 배열에는 2개 곡의 [곡 번호, 재생 횟수]가 저장된 것을 볼 수 있다.
3. 2번을 수행하는 과정에서 장르별 재생 횟수도 모두 합하여 별도의 배열에 저장한다.
→ ex) [[0, 1450], [1, 3100]]
[장르 번호, 총 재생횟수] 순으로 저장한다. classic 곡들은 총 1450번, pop 곡들은 총 3100번 재생된 것을 볼 수 있습니다.
4. 장르별 배열을 재생횟수 순으로 정렬한다.
→ ex) [[[3, 800], [0, 500], [2, 150]], [[4, 2500], [1, 600]]]
5. 장르별 총 재생횟수를 정렬한다.
→ ex) [[1, 3100], [0, 1450]]
총 재생횟수가 높은 장르의 순서는 1(pop), 0(classic)으로 정렬되었다.
6. 재생횟수가 많은 장르별로 2개씩 뽑아 인덱스로 이루어진 리스트 만든다.
→ ex) [4, 1, 3, 0]
이 때 각 장르 배열별로 2곡씩만 뽑아야하며, 1곡만 있는 장르의 경우 1곡만 담아야 한다는 점을 명심해야 한다.
필요하시면 댓글로 말씀해주시면 부족한 코드라도 보내드리겠습니다.
* 해쉬
임의의 크기를 가진 데이터를 고정된 데이터의 크기로 변환시키는 것.
기존 자료구조 -> 탐색이나 삽입에 선형적인 시간이 걸림
해쉬 : 탐색이나 삽입 시 위치를 바로 찾을 수 있음
* 해쉬 방식
1. Direct Addressing Table : (Key - Value) 쌍의 데이터 중의 Key 값을 배열의 인덱스로
사용한다. Key 값이 400인 값이 존재한다면, 400 이전의 값들은 모두 Null 처리하고, 인덱스가 400
인 곳에 Value값을 저장할 수 있다. 단점은 저장을 위해 할당되는 배열의 크기가 Key 값의 최대값과
일치한다는 점이며, (Key - Value)쌍의 데이터가 적을 경우 공간이 낭비될 확률이 높다.
2. Hash Table : Key값을 함수를 통해 계산을 수행한 후, 그 결과값을 배열의 인덱스로 사용한다.
H(k)라는 해쉬 함수를 만든 후, Key 값을 넣어서 결과값인 H(k)를 배열의 인덱스로 사용한다. H(k)
값은 0부터 배열의 크기 -1 사이의 값을 가진다. H(k)를 k의 해쉬값이라고 한다. Direct Addressing
Table에 비해 공간 낭비가 적지만, h(k)값이 중복(충돌)될 수 있으므로 유의해야 한다.
이를 위해 Chaining 등의 방법을 사용한다.