쿠릉쿠릉 쾅쾅
쿠릉쿠릉 쾅쾅
쿠릉쿠릉 쾅쾅
250x250
전체 방문자
오늘
어제
  • 분류 전체보기
    • HTML CSS
    • 잡담
    • 프로그래밍 꿀팁 사이트
    • 코딩 도서
    • [자바]
      • 디자인 패턴
      • 자바의 정석 - 3판
      • 자바
      • 자바 문법
    • git
    • [TDD]
    • 개발 서적 독후감
      • 클린 코더
      • 토비 스프링3
      • 객체지향의 사실과 오해
      • 모던 자바 인 액션
      • 엘레강트 오브젝트
    • CS
      • 운영체제
      • HTTP
    • [SQL]
      • SQL 기초
      • 혼자공부하는SQL
    • [ Spring ]
      • REST API
      • Spring Toy
      • Spring 에러
      • Spring
      • Spring 입문
      • Spring 핵심 원리
      • SpringMVC 1편
      • SpringMVC 2편
      • Spring Boot를 이용한 RESTful We..
      • Batch
    • [JPA]
      • JPA
      • JPA 에러
      • JPA 프로그래밍 - 기본편
      • 스프링 부트와 JPA 활용 1 - 웹 애플리케이..
      • 실전! 스프링 부트와 JPA 활용2 - API 개..
      • 실전! 스프링 데이터 JPA
      • 실전! Querydsl
    • 인텔리제이
    • [DB]
      • DB
      • H2
    • Gradle
    • 면접
    • [알고리즘]
      • 알고리즘
      • 자료구조
      • 자바 알고리즘 공부
    • [프로젝트]
    • 쿠릉식 객체지향 사고
    • 리눅스

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 깃허브
  • REST API
  • 재귀
  • springboot
  • 자료구조
  • http
  • 자바
  • GitHub
  • 알고리즘
  • 함수형인터페이스
  • MVC
  • querydsl
  • 스프링
  • Git
  • Spring
  • java
  • SQL
  • 백준
  • JPA
  • 스프링부트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쿠릉쿠릉 쾅쾅

쿠릉쿠릉 쾅쾅

[알고리즘]/알고리즘

[알고리즘] 베스트앨범 (프로그래머스 3레벨)

2022. 4. 23. 19:10
728x90

 

 

문제

https://programmers.co.kr/learn/courses/30/lessons/42579

 

풀이

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        
    	// <장르, 곡 재생횟수 리스트>
        Map<String, List<Integer>> map = new HashMap<>();
        
        for(int i=0; i<genres.length; i++) {
        	if(map.containsKey(genres[i])) {
        		map.get(genres[i]).add(plays[i]); // 리스트에 값 추가
        		continue;
        	}

        	// map에 해당 장르가 없는 경우 
        	map.put(genres[i], new ArrayList<>()); // value 값에 리스트 생성
        	map.get(genres[i]).add(plays[i]);  // 리스트에 값 추가
        }
        
        // 정답 배열 길이
        int arrLength = 0;
        
        // 정답 배열의 길이를 구하는 로직 : 한 장르에 곡 개수가 2개 이상일 때는 +2, 1개일 때는 +1
        for(String key : map.keySet()) {
        	if(map.get(key).size()>=2) {
        		arrLength+=2;
        		continue;
        	}
        	arrLength++;
        }

        // 정답 배열
        int[] arr = new int[arrLength];
        
        List<String> keySetList = new ArrayList<>(map.keySet());

        // key 값을 value 값 기준으로 내림차순으로 정렬
        keySetList.sort(
                (s1, s2) -> sumOfLists(map.get(s2)) - sumOfLists(map.get(s1))
                );

        
        int idx = 0; // 정답 배열의 idx 값
        
        for(String key : keySetList) {
            
        	/**
        	 * 한 장르에 곡 개수가 2개 이상인 경우
        	 */
        	if(map.get(key).size()>=2) {
        		
        		int temp = idx;  // idx 값을 잠시 보관할 값
        		
        		// 값이 채워졌는지 안채워졌는지 확인
        		boolean checkOne = false;
        		boolean checkTwo = false;
        		
        		// map의 key 값의 value 리스트의 내림차순 정렬 
        		Collections.sort(map.get(key), Collections.reverseOrder());
                
            	for(int i=0; i<genres.length; i++) {
                    
            		// 한 장르당 재생 리스트가 많은 2개의 곡이 모두 채워졌을 경우 break
            		if(checkOne && checkTwo) break;

            		if(key.equals(genres[i]) // key 값과 장르가 일치해야 한다.
            				&& map.get(key).get(0) == plays[i]  // 장르 내 재생 수가 가장 많은 리스트의 곡이다.
            						&& !checkOne) {  // 값이 아직 안채워져야 한다.
            			
            			arr[temp] = i;  // arr의 temp 값에 i 번쨰 값을 넣는다.
            			checkOne = true;  // 값이 채워졌으므로 true
            			continue;
            		}
            		
            		if(key.equals(genres[i]) // key 값과 장르가 일치해야 한다.
            				&& map.get(key).get(1) == plays[i] // 장르 내 재생 수가 2번째로 많은 리스트의 곡이다. 
            						&& !checkTwo) { // 값이 아직 안채워져야 한다.
            			
            			arr[temp+1] = i;  // arr의 temp+1 값에 i번째 값을 넣는다.
            			checkTwo = true;  // 값이 채워졌으므로 true
            		}
            	}
            	
            	idx +=2;  // 2개의 값을 채웠으므로 idx 값을 +2 한다.
        		continue;
        	}
        	
        	/**
        	 * 한 장르에 곡 개수가 1개인 경우
        	 */
        	for(int i=0; i<genres.length; i++) {
        		if(key==genres[i]) {  // 장르만 일치하면 된다.
        			arr[idx++] = i;
        		}
        	}
        	
        }  // end for key
        
        return arr;
    }
    
    // 리스트의 합을 구하는 메서드
    static int sumOfLists(List<Integer> list) {
    	return list.stream().mapToInt(Integer::intValue).sum();
    }
    
}

 

 

 

 

728x90

'[알고리즘] > 알고리즘' 카테고리의 다른 글

[알고리즘] 백준 2002번 : 추월 (실버1)  (0) 2022.04.23
[알고리즘] 백준 6996번 : 애너그램 (브론즈1)  (0) 2022.04.23
[알고리즘] 백준 22862번 : 가장 긴 짝수 연속한 부분 수열 (large) (실버1)  (0) 2022.04.23
[알고리즘] 백준 16967번 : 배열 복원하기 (실버3)  (0) 2022.04.18
[알고리즘] 백준 1268번 : 임시 반장 정하기 (브론즈1)  (0) 2022.04.18
    '[알고리즘]/알고리즘' 카테고리의 다른 글
    • [알고리즘] 백준 2002번 : 추월 (실버1)
    • [알고리즘] 백준 6996번 : 애너그램 (브론즈1)
    • [알고리즘] 백준 22862번 : 가장 긴 짝수 연속한 부분 수열 (large) (실버1)
    • [알고리즘] 백준 16967번 : 배열 복원하기 (실버3)
    쿠릉쿠릉 쾅쾅
    쿠릉쿠릉 쾅쾅
    깃허브 주소 : https://github.com/kureung

    티스토리툴바