본문 바로가기

Algorithm/Programers - Java

[프로그래머스(Java)] 문자열 묶기 / Stream, groupingBy(), orElse(), orElseGet()

 

Level. 0

 

문제

문자열 배열 strArr이 주어집니다. 
strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.

* 제한사항
- 1 ≤ strArr의 길이 ≤ 100,000
- 1 ≤ strArr의 원소의 길이 ≤ 30
- strArr의 원소들은 알파벳 소문자로 이루어진 문자열입니다.

 

풀이

class Solution {
    public int solution(String[] strArr) {
        int answer = 0;
        int[] counts = new int[31];
        for(int i=0; i<strArr.length; i++){
            counts[strArr[i].length()] += 1;
        }
        
        for(int i=1; i<=30; i++){
            answer = Math.max(answer, counts[i]);
        }
        
        return answer;
    }
}

 


다른 풀이

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public int solution(String[] strArr) {
        return Arrays.stream(strArr).collect(Collectors.groupingBy(String::length)).values().stream().max(Comparator.comparingInt(List::size)).orElse(Collections.emptyList()).size();
    }
}

 

 

 

gourpingBy()

 

Collectors의 groupingBy()는 요쇼들을 그룹핑하여 Map객체를 리턴한다. 

 

 

orElse 와 orElseGet

 

1. orElse

public T orElse(T other) {
        return value != null ? value : other;
}

List<String> list = Arrays.asList("1","2","3");
String str = list.stream().filter(p-> p.equals("3")).findAny().orElse("NotNull");

orElse 는 값이 null 이 아닐 경우 해당 값을 반환하고, null일경우Type T를 그대로 반환한다.

 

2. orElseGet

public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
}

 String str = list.stream().filter(p-> p.equals("3")).findAny().orElseGet(()->"NotNull");

Optional의 값이 null이 아닐 경우 해당 값을 반환하고, null일경우 Supplier Generice로 넘겨받았을 때의 값을 리턴한다. 

 

둘 다 기능은 비슷하지만 인자 메소드의 실행 타이밍이 달라진다.

- orElse는 값을 인수로 받기때문에, 인수가 메소드일 경우 null이 아니더라도 메소드가 실행된다. 

- orElseGet은 인수로 전달된 Supplier 메소드의 경우 Optional의 값이 null일 경우만 실행된다. 

 


https://school.programmers.co.kr/learn/courses/30/lessons/181855

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://gem1n1.tistory.com/159

 

[Java Stream] GroupingBy 를 이용한 그룹화 예시 소개

Introduction Java 8에서 처음 도입된 스트림은 데이터 집합을 처리할 수 있는 반복자 역할을 수행한다. 스트림의 연산은 filter, map과 같이 중간 연산자와, collect와 같은 최종 연산자로 구분된다. 이 포

gem1n1.tistory.com

https://erjuer.tistory.com/102

 

[Optional] orElse와 orElseGet의 차이

실무개발을 진행하면서 자주 썼지만 정확한 차이에 대해 혼동이 있던 것 중 orElse와 orElseGet의 차이에 대해 정리하고자 한다. 우선 orElse와 orElseGet는 Java 8의 Optional 도입과 함께 등장했던 메소드다

erjuer.tistory.com