자바 & 스프링

Stream 연습 문제 2 - 심화

p829911 2022. 1. 12. 02:37

Java의 Stream 공부를 하다, 풀어볼 수 있는 연습문제가 있으면 좋겠다는 생각을 해서 포스팅 해봤습니다.
문제 난이도는 기본, 심화로 나눴습니다.
기본 문제는 모던 자바 인 액션 이라는 책의 Chapter5를 약간 변형해서 첨부하였고,
심화 문제는 알고리즘 문제를 풀면서 자주 사용할 것 같은 기법에 대해 직접 문제를 만들어 봤습니다.

혹시라도 더 효율적인 코드가 있거나 문제에 오류가 있으면 많은 피드백 부탁드립니다.

2022.01.12 - [자바 & 스프링] - Stream 연습 문제 1 - 기본

 

Stream 연습 문제 1 - 기본

Java의 Stream 공부를 하다, 풀어볼 수 있는 연습문제가 있으면 좋겠다는 생각을 해서 포스팅 해봤습니다. 문제 난이도는 기본, 심화로 나눴습니다. 기본 문제는 모던 자바 인 액션 이라는 책의 Chap

p829911.tistory.com

준비 코드

public class Advance {
    public static void main(String[] args) {
        String[] alphabetList = new String[]{
            "ABCAAC",
            "AABBCC",
            "CCCCCC",
            "CCBBAA",
            "CCCAAA"
        };

    // 1. alphabetList 각각의 스트링에 있는 고유한 알파벳 개수가 들어있는 
    // List<Long> 형태의 배열을 반환하시오.
    
    // 2. alphabetList 각각의 스트링에 대해 알파벳을 키로, 
    // 키에 해당하는 알파벳 개수를 값으로 하는
    // List<Map<String, Long>> 형태의 배열을 반환하시오.
    
    // 3. alphabetList 각각의 스트링에 대해 알파벳을 키로, 
    // 키에 해당하는 알파벳의 index 배열을 값으로 하는
    // List<Map<String, List<Integer>>> 형태의 배열을 반환하시오.
	
    }   
}

기대값

  1. [3, 3, 1, 3, 2]
  2. [{A=3, B=1, C=2}, {A=2, B=2, C=2}, {C=6}, {A=2, B=2, C=2}, {A=3, C=3}]
  3. [{A=[0, 3, 4], B=[1], C=[2, 5]}, {A=[0, 1], B=[2, 3], C=[4, 5]},
    {C=[0, 1, 2, 3, 4, 5]}, {A=[4, 5], B=[2, 3], C=[0, 1]}, {A=[3, 4, 5], C=[0, 1, 2]}]

정답

1. alphabetList 각각의 스트링에 있는 고유한 알파벳 개수가 들어있는 배열을 반환하시오.

List<Long> answer1 = Arrays.stream(alphabetList)
    .map(s -> Arrays.stream(s.split(""))
        .distinct()
        .count())
    .collect(Collectors.toList());

System.out.println(answer1);

2. alphabetList 각각의 스트링에 대해 알파벳을 키로, 키에 해당하는 알파벳 개수를 값으로 하는
List<Map<String, Long>> 형태의 배열을 반환하시오.

List<Map<String, Long>> answer2 = Arrays.stream(alphabetList)
    .map(s -> Arrays.stream(s.split(""))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
    )
    .collect(Collectors.toList());

System.out.println(answer2);

3. alphabetList 각각의 스트링에 대해 알파벳을 키로, 키에 해당하는 알파벳의 index 배열을 값으로 하는
List<Map<String, List<Integer>>> 형태의 배열을 반환하시오.

List<Map<String, List<Integer>>> answer3 = Arrays.stream(alphabetList)
    .map(s -> s.split(""))
    .map(s -> IntStream.range(0, s.length)
        .boxed()
        .collect(Collectors.groupingBy(i -> s[i])))
    .collect(Collectors.toList());
System.out.println(answer3);