프로그래머스/Lv. 2

[프로그래머스 코딩테스트] 최댓값과 최솟값(Java)

Sigfriede 2023. 4. 8. 16:55

  문제 설명

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

  예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

 

  제한사항

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

 

  입출력 예

s return
"1 2 3 4" "1 4"
"-1 -2 -3 -4" "-4 -1"
"-1 -1" "-1 -1"
import java.util.Arrays;
class Solution {
    public String solution(String s) {
        String answer = "";
        String[] str = s.split(" ");
        int[] num = new int[str.length];
        for (int i = 0; i < str.length; i++) {
            num[i] = Integer.parseInt(str[i]);
        }
        Arrays.sort(num);
        
        String[] string = {Integer.toString(num[0]), Integer.toString(num[num.length - 1])};
        answer = String.join(" ", string);
        return answer;
    }
}

  s를 공백으로 구분한 문자열 배열 str을 생성했습니다. str 배열을 int형으로 바꾼 원소를 담을 int형 배열도 생성했습니다. for문이 str의 길이만큼 순회합니다. Integer 클래스의 parseInt 메소드를 사용하여 str의 i번째 원소를 int형으로 형변환을 한 뒤, num의 i번째에 이를 각각 할당합니다.

  문제에서는 최대값과 최소값을 요구하고 있으므로 배열 정렬을 통해 가장 처음과 마지막 값을 각각 인덱싱하면 됩니다. answer는 문자열이므로 문자열 배열을 다시 생성해줍니다. 각 원소는 int형이므로 다시 Integer 클래스의 toString 메소드를 통해 문자열로 변환하여 배열에 할당합니다.

  앞서 생성한 배열을 String 클래스의 join 메소드를 이용하여 공백으로 구분한 문자열로 만들어줍니다. 이를 answer에 할당하고 반환합니다.

  다른 풀이에서는 모르겠지만 제 풀이에서는 모두 필요한 과정이었습니다. 비록 문자열과 정수형과 배열을 오가는 복잡한 계산이었지만요. 문자열을 정수형으로 바꾼 이유는 음수 부호 때문입니다. 음수 부호가 없었더라면 배열 상태로 정렬했을 때 정상적인 오름차순 배열이 완성되지만, 음수 부호가 있기 때문에 "-1 -2 -3 -4" 같은 형태로 정렬이 제대로 진행되지 않는 것입니다. 따라서 parseInt를 통해(이는 부호까지 자동으로 계산해주므로) 정상적인 오름차순 형태의 배열을 얻고자 했습니다.

  또한 배열과 문자열을 반환했을 때 차이는 대괄호의 유무입니다. 만약 Arrays 클래스의 toString을 사용한다면 대괄호가 존재하는 상태로 반환합니다. 이는 따옴표와 공백으로 구분하는 입출력 예와는 다른 결과를 반환하게 되는 것입니다. 따라서 join 메소드를 통해 배열을 공백으로 구분하는 문자열로 바꿔주었습니다.

 

  parseInt를 사용한 다른 문제(parseInt와 valueOf의 차이 간단한 설명)

  [프로그래머스 코딩테스트] 문자열을 정수로 바꾸기(Java)

  https://sigfriede.tistory.com/95

 

  단계 치고는 간단한 편에 속하는 문제이지만, 2단계 문제를 풀게 되는 날도 오고 감회가 새롭습니다. 하지만 저는 여전히 0단계와 1단계에서도 풀지 못한 문제가 수두룩하네요. 이젠 정말 못푸는 문제들 뿐인데…….