사용자 취향 반영을 위한 음악 추천 알고리즘 개선 과정
·
SPRINGBOOT/음악 스트리밍 서비스
사용자 맞춤형 음악 추천 기능을 구현하기 위해서는, 사용자의 취향을 정확하게 반영할 수 있는 알고리즘 설계가 핵심입니다.MiTi 프로젝트에서는 이를 위해 곡의 특성을 기반으로 한 벡터 유사도 계산 방식을 도입하였고, 추천 정확도를 높이기 위한 리팩터링을 단계적으로 진행하였습니다.  💡 기존 추천 알고리즘 설계 방식 설계한 알고리즘: 개인 맞춤형 음악 추천, 장르별 음악 추천, 유사 음악 추천 # user_records에 포함된 album_id에 대해 평균 특성 벡터를 계산하는 함수def calculate_average_features(user_records, album_dict): feature_sums = np.zeros(len(next(iter(album_dict.values())))) # ..
Spotify 음악 크롤링 중 마주한 문제들과 이를 해결한 과정
·
SPRINGBOOT/음악 스트리밍 서비스
📌 프로젝트 배경 음악 스트리밍 프로젝트 ‘MiTi’에서는 사용자의 취향에 맞는 음악을 추천하기 위해 Spotify API를 이용한 음악 데이터 크롤링이 필요했습니다. 크롤링 과정에서 다양한 문제들이 발생했고, 이를 해결하며 기능의 완성도를 높일 수 있었습니다. spotify는 다른 플랫폼과는 달리 저작권이나 보안 문제를 책임지지 않아도 되고,특히 맞춤형 추천 기능이 주 기능인 저희 웹서비스에서는 추천 알고리즘을 중요하게 생각했기 때문에, 음악의 특성(danceability, energy 등)을 자세히 가져올 수 있어 해당 api를 선택하기로 결정했습니다.client_credentials_manager = SpotifyClientCredentials(client_id=client_id, client_s..
[우테코 프리코스 BE] 3주차 회고록
·
우아한 테크코스 프리코스
이번 주차에는 예외 테스트 2개 중 1개를 실패해서 정말 아쉽게 마무리하게됐다. 이번 주 문제점을 파악하고 다음주엔 부족한 점을 모두 개선해보려고 한다 ![https://github.com/woowacourse-precourse/java-lotto-7/pull/542](https://github.com/woowacourse-precourse/java-lotto-7/pull/542)## 3주차 [로또]### 📌 프로젝트 소개  이 프로젝트는 **로또**를 구현합니다.  사용자가 입력한 **당첨 번호**와 시스템이 생성한 **당첨 번호**를 비교하며 로또 게임을 진행합니다.  - 로또 번호는 1~45 사이의 중복하지 않는 7개의 무작위 값을 통해 당첨 여부를 결정합니다.  - 로또 구입 금액을 입력하면 구..
[우테코 프리코스 BE] 2주차 회고록
·
우아한 테크코스 프리코스
3주차 과제를 진행하기 전 회고록을 급하게 작성하려고 한다 ! 반성할 점은 뭔지, 더 개선해야할 점은 뭔지 정리를 하면 훨씬 코드를 짜는 데에 도움이 될 것 같다.[https://github.com/woowacourse-precourse/java-racingcar-7/pull/982](https://github.com/woowacourse-precourse/java-racingcar-7/pull/982)## 2주차 [문자열 덧셈 계산기]### 📌 프로젝트 소개  이 프로젝트는 **자동차 경주 게임**을 구현합니다.  사용자가 입력한 **경주할 자동차 이름**으로 주어진 **횟수만큼 이동**하며 경기를 진행합니다.  - 각 자동차는 0~9 사이의 무작위 값을 통해 전진 여부를 결정합니다.  - **4 이..
[우테코 프리코스 BE] 1주차 회고록
·
우아한 테크코스 프리코스
늦었지만 1주차부터 프리코스 과정을 되돌아보고자 한다 !https://github.com/woowacourse-precourse/java-calculator-7/pull/13231주차 [문자열 덧셈 계산기]📌 프로젝트 소개이 프로젝트는 문자열 덧셈 계산기를 구현합니다.사용자가 입력한 문자열에서 숫자를 추출해 합을 계산하며, 쉼표(,)와 콜론(:)을 기본 구분자로 사용합니다.또한, 커스텀 구분자를 정의할 수 있으며, 잘못된 입력이 들어오면 예외를 발생시킵니다.🎯 기능 요구 사항기본 구분자: 쉼표(,)와 콜론(:)을 기준으로 문자열을 분리합니다.예: "1,2,3" → 결과: 6커스텀 구분자: "//[구분자]\n" 형식으로 입력하면 커스텀 구분자로 분리합니다.예: "//;\n1;2;3" → 결과: 6빈 문..
[programmers] 같은 숫자는 싫어
·
알고리즘 오답노트/JAVA
문제 풀이: 연속돼서 중복인 숫자가 들어가지 않도록 배열을 다시 저장함 import java.util.Stack;public class Solution { public int[] solution(int []arr) { Stack stack = new Stack(); for (int i : arr) { if (!stack.isEmpty() && stack.peek() == i) { continue; } else { stack.push(i); } } int[] answer = new int[stack.size()]..
[programmers] 의상
·
알고리즘 오답노트/JAVA
문제 풀이 : 의상의 이름은 중요하지 않고, 의상의 종류별로 몇 가지의 의상이 있는지 확인한 후 조합하는 경우의 수를 구해야 함각 옷마다 의상의 수+1이 종류 별 경우의 수인데, 예를 들어 위 표에서 얼굴은 안경을 쓰는 경우, 선글라스를 쓰는 경우, 아무것도 쓰지 않는 경우 이렇게 2+1개의 종류이므로 총 경우의 수는 3x2x2x2임이때! 모든 하나도 안 입는 경우가 발생하므로 1을 빼주어 3x2x2x2-1이 됨 import java.util.HashMap;class Solution { public int solution(String[][] clothes) { int answer = 1; HashMap map = new HashMap(); ..
[programmers] 전화번호 목록
·
알고리즘 오답노트/JAVA
문제 풀이 : 배열과 해시로 모두 풀이할 수 있음 !첫번째 번호가 다음 번호의 접두사인지 확인해야하는 문제 import java.util.Arrays;class Solution { public boolean solution(String[] phone_book) { boolean answer = true; Arrays.sort(phone_book); for(int i=0; i처음엔 배열로 풀이해보았는데, 먼저 배열을 정렬한 뒤 startsWith를 사용해 접두사인지 확인하여 문제를 해결함 import java.util.HashSet;class Solution { public boolean solution(String[] phone..
[programmers] 완주하지 못한 선수
·
알고리즘 오답노트/JAVA
문제 풀이 : 마라톤에 참여한 선수 중 완주하지 못한 선수의 이름을 출력해야 함hash는 키 값이 중복되지 않게 저장되는데 마라톤 선수의 이름이 중복될 수 있다고 해서방법이 생각이 나지 않아 chatgpt에게 방법을 물어봤음 ( 다음에 다시 혼자 풀어볼 것 ! )key값에 참가자 이름, value값에 사람 수를 작성하라고 알려줌 import java.util.HashMap;class Solution { public String solution(String[] participant, String[] completion) { String result = ""; HashMap map = new HashMap(); for(String name : participant)..
[programmers] 폰켓몬
·
알고리즘 오답노트/JAVA
문제 풀이 : 해당 문제는 중복되지 않는 수가 몇 개인지 찾아 출력하는 문제인데, 이때 출력 값은 N/2보다 클 수 없는 조건을 갖고 있음 처음에는 해시 타입을 사용해 본 적이 없어서 막무가내로 배열을 만들어 하나하나 비교해보았음시간 복잡도가 너무 올라가고, 정확도가 떨어져 해시맵을 사용해 봄 import java.util.HashMap;class Solution { public int solution(int[] nums) { int answer = 0; int a = nums.length; HashMap map = new HashMap(); for(int i=0; i= a/2) { answer = a/2; } el..