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

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

by The Future Engineer, Lucy 2024. 10. 7.

โ“๋ฌธ์ œ

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๐Ÿ“Œ์œ ํ˜•

ํ•ด์‹œ

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

์žฅ๋ฅด๋ณ„ ์ด ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•œ 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<T> predicate): ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๋งŒ ์„ ํƒ.
- map(Function<T, R> mapper): ๊ฐ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜.
- flatMap(Function<T, Stream<R>> mapper): ๊ฐ ์š”์†Œ๋ฅผ ์—ฌ๋Ÿฌ ์š”์†Œ๋กœ ํ™•์žฅํ•˜๊ณ  ํ‰ํƒ„ํ™”.
- distinct(): ์ค‘๋ณต๋œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐ.
- sorted(): ์š”์†Œ๋ฅผ ๊ธฐ๋ณธ ์ •๋ ฌ ์ˆœ์„œ๋กœ ์ •๋ ฌ.
- peek(Consumer<T> action): ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋™์ž‘ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜.
**์ŠคํŠธ๋ฆผ ์ตœ์ข… ์—ฐ์‚ฐ**
- forEach(Consumer<T> action): ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ฃผ์–ด์ง„ ๋™์ž‘์„ ์ˆ˜ํ–‰.
- toArray(): Stream์˜ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜..
- reduce(BinaryOperator<T> accumulator): ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ถ•์†Œ
- collect(Collector<T, A, R> collector): Stream์˜ ์š”์†Œ๋“ค์„ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ˆ˜์ง‘.
- min(Comparator<T> comparator): Stream์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๊ธฐ.
- max(Comparator<T> comparator): Stream์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๊ธฐ.
- count(): Stream์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜.
- anyMatch(Predicate<T> predicate): ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋Š”์ง€ ํ™•์ธ.
- allMatch(Predicate<T> predicate): ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธ.
- noneMatch(Predicate<T> predicate): ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ.
- findFirst(): Stream์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜.
- findAny(): Stream์˜ ์•„๋ฌด ์š”์†Œ๋‚˜ ๋ฐ˜ํ™˜.