will come true

[프로그래머스/Level2] 최댓값과 최솟값 본문

Algorithm

[프로그래머스/Level2] 최댓값과 최솟값

haehyun 2022. 1. 17. 18:27

문제

https://programmers.co.kr/learn/courses/30/lessons/12939?language=java 

 

코딩테스트 연습 - 최댓값과 최솟값

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

programmers.co.kr

 

풀이

공백으로 구분된 문자열s에서 최솟값과 최대값을 추출하여 출력하라.

접근 방법

두 가지 접근 방법이 떠오르는데 두 방법으로 모두 구현해본 뒤 효율성을 비교해보기로 했다.

A. 문자열을 공백 분리하는 동시에 해당 숫자를 min, max와 비교해서 최솟값, 최댓값 갱신. 최종적으로 min에 저장된 값을 최솟값으로, max에 저장된 값을 최댓값으로 반환

B. 문자열을 공백 분리하여 숫자 배열로 전환한 뒤, 오름차순 정렬. 맨 앞의 값을 최솟값으로, 맨 마지막 값을 최댓값으로 반환

 

코드 (A)

import java.util.StringTokenizer;

class Solution {
    public String solution(String s) {
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;

        StringTokenizer st = new StringTokenizer(s, " ");
        while (st.hasMoreTokens()) {
            int num = Integer.parseInt(st.nextToken());
            // 최솟값, 최댓값 비교
            min = Math.min(min, num);
            max = Math.max(max, num);
        }

        return min + " " + max;
    }
}

 

  • 실행 로직
    • StringTokenizer로 문자열 공백 분리
    • 분리된 String타입 토큰을 int타입으로 변환
    • min과 num을 비교해서 최솟값을 min에 저장
    • max와 num을 비교해서 최댓값을 max에 저장
    • 최종 갱신된 min, max 값을 반환
  • min, max 선언 시 값을 0으로 초기화하지 않도록 주의하자. s가 "12345" 일 경우 min값으로 1이 최종 저장되어야 하는데, min을 처음에 0으로 초기화 해버리면 s문자열의 어떤 수(1, 2, 3, 4, 5)랑 비교해도 초기값보다 작은 값이 없기 때문에 마지막 반환에서 min이 0으로 반환되게 된다. 같은 이유로 max값도 0으로 초기화 해버리면 s가 "-1-2-3-4"와 같이 음수 조합일 경우 최대값으로 -1을 반환하는 게 아니라 초기값이 0을 반환하게 되어 제대로 된 최솟값or최댓값을 구할 수 없게된다. 이를 위해서 min값은 Integer.MAX_VALUE 로 초기화해서 어떤 수랑 비교해도 그 수가 더 값이 작아 min에 저장될 수 있도록 한다.

 

코드 B

import java.util.Arrays;

class Solution {
    public String solution(String s) {
        String[] arr = s.split(" ");
        int[] arr2 = new int[arr.length];

        for (int i = 0; i < arr.length; i++) {
            arr2[i] = Integer.parseInt(arr[i]);
        }

        Arrays.sort(arr2);
        
        return arr2[0] + " " + arr2[arr2.length - 1];
    }
}

 

  • 실행로직
    • String 타입을  공백을 기준으로 분리해 String[] 배열에 저장
    • String[] 배열의 각 값을 int타입으로 변환해 int[] 배열에 저장
    • int[] 배열을 오름차순 정렬 (작은 값 ~ 큰 값 순으로 정렬됨)
    • 맨 앞의 값(가장 작은 값)과 맨 마지막 값(가장 큰 값)을 반환
Comments