๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Coding Test/Algorithms

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ฒ ์ŠคํŠธ์•จ๋ฒ”/Java - Lv.3

by The Future Engineer, Lucy 2024. 10. 7.
728x90
๋ฐ˜์‘ํ˜•

โ“๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

์„ฑ๋Šฅ ์š”์•ฝ

๋ฉ”๋ชจ๋ฆฌ: 75.5 MB, ์‹œ๊ฐ„: 4.40 ms

๋ฌธ์ œ ์„ค๋ช…

์ŠคํŠธ๋ฆฌ๋ฐ ์‚ฌ์ดํŠธ์—์„œ ์žฅ๋ฅด ๋ณ„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜๋ฅผ ๋‘ ๊ฐœ์”ฉ ๋ชจ์•„ ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์„ ์ถœ์‹œํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋ž˜๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ๋…ธ๋ž˜๋ฅผ ์ˆ˜๋กํ•˜๋Š” ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์†ํ•œ ๋…ธ๋ž˜๊ฐ€ ๋งŽ์ด ์žฌ์ƒ๋œ ์žฅ๋ฅด๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.
  2. ์žฅ๋ฅด ๋‚ด์—์„œ ๋งŽ์ด ์žฌ์ƒ๋œ ๋…ธ๋ž˜๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.
  3. ์žฅ๋ฅด ๋‚ด์—์„œ ์žฌ์ƒ ํšŸ์ˆ˜๊ฐ€ ๊ฐ™์€ ๋…ธ๋ž˜ ์ค‘์—์„œ๋Š” ๊ณ ์œ  ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ๋…ธ๋ž˜๋ฅผ ๋จผ์ € ์ˆ˜๋กํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋ž˜์˜ ์žฅ๋ฅด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด genres์™€ ๋…ธ๋ž˜๋ณ„ ์žฌ์ƒ ํšŸ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด plays๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๋ฒ ์ŠคํŠธ ์•จ๋ฒ”์— ๋“ค์–ด๊ฐˆ ๋…ธ๋ž˜์˜ ๊ณ ์œ  ๋ฒˆํ˜ธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • genres[i]๋Š” ๊ณ ์œ ๋ฒˆํ˜ธ๊ฐ€ i์ธ ๋…ธ๋ž˜์˜ ์žฅ๋ฅด์ž…๋‹ˆ๋‹ค.
  • plays[i]๋Š” ๊ณ ์œ ๋ฒˆํ˜ธ๊ฐ€ i์ธ ๋…ธ๋ž˜๊ฐ€ ์žฌ์ƒ๋œ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • genres์™€ plays์˜ ๊ธธ์ด๋Š” ๊ฐ™์œผ๋ฉฐ, ์ด๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ์žฅ๋ฅด ์ข…๋ฅ˜๋Š” 100๊ฐœ ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค.
  • ์žฅ๋ฅด์— ์†ํ•œ ๊ณก์ด ํ•˜๋‚˜๋ผ๋ฉด, ํ•˜๋‚˜์˜ ๊ณก๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์žฅ๋ฅด๋Š” ์žฌ์ƒ๋œ ํšŸ์ˆ˜๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

genres plays return
["classic", "pop", "classic", "classic", "pop"] [500, 600, 150, 800, 2500] [4, 1, 3, 0]

โœ๐Ÿปํ’€์ด

์žฅ๋ฅด๋ณ„ ์ด ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•œ HashMap์„ ๊ตฌํ•จ.
pop์—๋Š” 1, 4๋ฒˆ์ด classic์—๋Š” 0, 2, 3 ๋ฒˆ์œผ๋กœ ๋‚˜๋ˆ”์œผ๋กœ์จ ๊ฐ ์žฅ๋ฅด๋ณ„๋กœ ์•จ๋ฒ”์„ ๋‚˜๋ˆ”.
์žฅ๋ฅด๋ณ„ ์ด ํšŸ์ˆ˜๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ด ํšŸ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์žฅ๋ฅด ์ˆœ์œผ๋กœ ์ •๋ ฌํ•จ.
๊ฐ ์žฅ๋ฅด๋ณ„๋กœ ์•จ๋ฒ”๋„ ์žฌ์ƒ ํšŸ์ˆ˜๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•จ.
์•จ๋ฒ” ์ค‘ ์žฌ์ƒํšŸ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ๊ฒƒ์„ answer์— ์ถ”๊ฐ€. ์•จ๋ฒ”์˜ ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€.

๐Ÿ’ป์ฝ”๋“œ

import java.util.*;
import java.io.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        Map<String, Integer> cnt = new HashMap<>();
        Map<String, HashMap<Integer, Integer>> album = new HashMap<>();

        for(int i = 0; i < genres.length; i++){
            if(!cnt.containsKey(genres[i])){
                HashMap<Integer, Integer> m = new HashMap<>();
                m.put(i, plays[i]);
                album.put(genres[i], m);
                cnt.put(genres[i], plays[i]);
            } else {
                album.get(genres[i]).put(i, plays[i]);
                cnt.put(genres[i], cnt.get(genres[i]) + plays[i]);

            }
        }

        List<String> keySet = new ArrayList<>(cnt.keySet());
        keySet.sort((o1, o2) -> cnt.get(o2) - (cnt.get(o1)));
        List<Integer> answer = new ArrayList();

        for(String i : keySet) {
            HashMap<Integer, Integer> map = album.get(i);
            List<Integer> key = new ArrayList(map.keySet());

            key.sort((o1, o2) -> map.get(o2) - (map.get(o1)));

            answer.add(key.get(0));
            if(key.size() > 1) // ํ˜„์žฌ ์žฅ๋ฅด์˜ ์•จ๋ฒ” ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ์ถ”๊ฐ€.
                answer.add(key.get(1));
        }

        return answer.stream().mapToInt(i -> i).toArray();
    }
}

๐Ÿ’ก์ƒˆ๋กœ ๋ฐฐ์šด ๋‚ด์šฉ

List ๋žŒ๋‹คํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ

  • ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ List.sort((o1, o2) -> map.get(o1) - (map.get(o2)))
  • ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ List.sort((o1, o2) -> map.get(o2) - (map.get(o1)))

์ŠคํŠธ๋ฆผ

  • ์ปฌ๋ ‰์…˜, ๋ฐฐ์—ด ๋“ฑ์— ์ €์žฅ๋œ ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ์ฐธ์กฐํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ.
  • ๋ถˆํ•„์š”ํ•œ for๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ง๊ด€์ ์ด๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ.

์ŠคํŠธ๋ฆผ ์ค‘๊ฐ„ ์—ฐ์‚ฐ

  • filter(Predicate predicate): ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๋งŒ ์„ ํƒ.
  • map(Function<T, R> mapper): ๊ฐ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜.
  • flatMap(Function<T, Stream> mapper): ๊ฐ ์š”์†Œ๋ฅผ ์—ฌ๋Ÿฌ ์š”์†Œ๋กœ ํ™•์žฅํ•˜๊ณ  ํ‰ํƒ„ํ™”.
  • distinct(): ์ค‘๋ณต๋œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐ.
  • sorted(): ์š”์†Œ๋ฅผ ๊ธฐ๋ณธ ์ •๋ ฌ ์ˆœ์„œ๋กœ ์ •๋ ฌ.
  • peek(Consumer action): ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋™์ž‘ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜.

์ŠคํŠธ๋ฆผ ์ตœ์ข… ์—ฐ์‚ฐ

  • forEach(Consumer action): ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ๋™์ž‘์„ ์ˆ˜ํ–‰.
  • toArray(): Stream์˜ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜..
  • reduce(BinaryOperator accumulator): ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ถ•์†Œ
  • collect(Collector<T, A, R> collector): Stream์˜ ์š”์†Œ๋“ค์„ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ˆ˜์ง‘.
  • min(Comparator comparator): Stream์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๊ธฐ.
  • max(Comparator comparator): Stream์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๊ธฐ.
  • count(): Stream์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜.
  • anyMatch(Predicate predicate): ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋Š”์ง€ ํ™•์ธ.
  • allMatch(Predicate predicate): ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธ.
  • noneMatch(Predicate predicate): ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ.
  • findFirst(): Stream์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜.
  • findAny(): Stream์˜ ์•„๋ฌด ์š”์†Œ๋‚˜ ๋ฐ˜ํ™˜.
728x90
๋ฐ˜์‘ํ˜•