Develop/Algorithm

프로그래머스 lv.2 - 12939 최댓값과 최솟값

IJY 2022. 11. 4. 20:00

프로그래머스 lv.2 - 12939 최댓값과 최솟값 문제 풀이

문제 설명

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

 

문제의 자세한 내용은 해당 링크를 통해 확인 : 문제 링크

 

풀이 코드

import java.util.Arrays;

class Solution {
    public String solution(String s) {
        int min = Arrays.stream(s.split(" ")).mapToInt(Integer::valueOf).min().orElse(0);
        int max = Arrays.stream(s.split(" ")).mapToInt(Integer::valueOf).max().orElse(0);
        String answer = min + " " + max;
        return answer;
    }
}

반복문을 사용한 코드

더보기
import java.util.Arrays;

class Solution {
    public String solution(String s) {
        String[] sArray = s.split(" ");
        int min = Integer.valueOf(sArray[0]), max = Integer.valueOf(sArray[0]);
        for(String o : sArray) {
            Integer i = Integer.valueOf(o);
            if(min > i) {
                min = i;
            } 
            if(max < i) {
                max = i;
            }
        }
        String answer = min + " " + max;
        return answer;
    }
}

문제 해결 전략

이라 쓰고 문제를 보고서 어떻게 풀면 될까?에 대한 생각을 정리한 항목

왜 난이도가 lv.2로 책정이 되어있는지 잘 모르겠던 문제..

stream을 사용하면 간단하게 바로 구할 수 있다!

그런데 stream으로 구현을 했더니 거의 모든 테스트에서 10ms를 초과!

그래서 for문을 사용하여 구현하면 얼마나 차이가 날까? 라는 궁금증에 구현을 해보았다. (위에서 접힌 코드)

그랬더니 12개의 테스트 중 3개를 제외하고 전부 10ms 미만의 속도가 나왔다!

사실 8 ~ 9ms가 나왔기 때문에 엄청나게 큰 차이는 아니라고 생각이 되지만 왜 이런 차이가 나왔는지 의문이다.

일단 stream을 2번 사용하면서 2회의 반복이 일어나고, 반복문 사용 코드는 for문 1회 내에서 끝냈기 때문일까..? 🤔

(그런데 split() 메서드 사용 때문에 결국 비슷한게 아닌가..?)


코드를 업로드해 둔 깃 허브