프로그래머스 Lv2 최댓값과 최솟값

weonest·2023년 4월 8일
0

coding-test

목록 보기
4/36

문제 설명

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

제한 조건

  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

입출력 예

sreturn
"1 2 3 4""1 4"
"-1 -2 -3 -4""-4 -1"
"-1 -1""-1 -1"

나의 풀이

이번 문제는 문자열로 구성된 숫자들의 최댓값과 최솟값을 구하는 문제인데, String → Integer 혹은 int로의 변환을 한 뒤에 stream 메서드인 max() 와 min()을 이용하면 되지 않을까? 라는 생각으로 접근하여 문제를 풀어냈다.

import java.util.Arrays;
import java.util.NoSuchElementException;

class Solution {
    public String solution(String s) {
        String answer = "";

        String[] arr = s.split(" ");

        int[] nums = Arrays.stream(arr).mapToInt(Integer::parseInt).toArray();

        int min = Arrays.stream(nums).map(x -> x).min().orElseThrow(NoSuchElementException::new);

        int max = Arrays.stream(nums).map(x -> x).max().orElseThrow(NoSuchElementException::new);

        return answer += min + " " + max;
    }
}

우선 공백을 기준으로 문자열을 split 하여 String[] arr에 담아주었다. 그 후에 반복문이 아닌 stream 메서드를 통해 int[] nums로 다시 바꿔주었으며, 다시 int 배열 nums의 stream 메서드를 활용하여 최솟값과 최댓값을 구해낼 수 있었다.

nums의 stream 메서드에서 min()max()OptionalInt 형으로 반환되기 때문에 위와 같이 예외처리를 통해 int 변수에 담아올 수 있게 했다.

생각보다 너무나 간단하게 stream만을 활용하여 문제를 풀어냈는데, 알고리즘을 활용한 풀이를 하지 않았기에 어딘가 찝찝하여 다른 사람의 알고리즘 풀이를 분석해보았다.

참고로 stream은 라이브러리를 사용하는 “내부반복” 개념이다. 따라서 나의 코드는 3번의 for문을 돌린 코드와 별 다를바가 없다는 것! 보기엔 간결해도 좋은 코드는 아니라는 것!

다른 사람의 풀이

public class Solution {
    public String solution(String str) {
        String[] tmp = str.split(" ");
        int min, max, n;
        min = max = Integer.parseInt(tmp[0]);
        for (int i = 1; i < tmp.length; i++) {
                n = Integer.parseInt(tmp[i]);
            if(min > n) min = n;
            if(max < n) max = n;
        }

        return min + " " + max;

    }
}

위 알고리즘은 다음과 같이 작동한다

  1. min, max, n (임시변수) 를 선언한다
  2. minmax에는 배열의 첫 번째 값을 미리 담아준다. (반복자 조건을 위해)
  3. 반복문을 통해 비교를 진행하는데 현재값(임시변수 n의 값)이 min보다 작다면 min을 n으로 변경, max 보다 크면 max를 n으로 변경하며 포인터를 옮겨 간다.

알고리즘을 통한 풀이 역시 상당히 간결했던 좋은 문제였다!

0개의 댓글