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

정상민·2023년 7월 20일

문제링크

문제 접근

  • 스트링 돌면서 '-' 또는 숫자 인식하자
  • 이후에 ' '(공백) 나올 때까지 스트링빌더에 넣어서 두 자리수 이상 숫자 get
  • Num클래스 만들어서 boolean(음수인지 아닌지), int(숫자값)으로 최소, 최대 값 기록

코드

import java.util.*;
class Solution {
    public String solution(String s) {
        StringBuilder answer = new StringBuilder();
        Num bigNum = new Num(true, Integer.MAX_VALUE);
        Num smallNum = new Num(false, Integer.MAX_VALUE);
        for(int i=0;i<s.length();i++){
            char now = s.charAt(i);
            if(now == ' '){ // 공백은 패스
                continue;
            }
            else if(now == '-'){ //음수 시작지점
                int j = i+1; // '-'이므로 하나 다음부터 시작
                StringBuilder temp = new StringBuilder();
                while(true){ //두자리수 이상 숫자 판단하기 위한 반복문
                    if(j >= s.length() || s.charAt(j) == ' '){ 
                        i = j; //i변수 위치 갱신
                        break;
                    }
                    temp.append(s.charAt(j));
                    j++;
                }
                int num = Integer.parseInt(temp.toString());
                if(bigNum.isMinus && num < bigNum.value){ //최댓값 갱신 조건문
                    bigNum.value = num;
                }
                if(!smallNum.isMinus){ //최솟값 갱신 조건문
                    smallNum.isMinus = true;
                    smallNum.value = num;
                }
                else if(smallNum.isMinus && num > smallNum.value){
                    smallNum.value = num;
                }
            }
            else if(now >= 48 && now <=57){ //양수 시작지점
                int j = i; //양수이므로 현재부터 시작
                StringBuilder temp = new StringBuilder();
                while(true){ //두자리수 이상 숫자 위한 반복문
                    if(j >= s.length() || s.charAt(j) == ' '){
                        i = j; //i변수 위치 갱신
                        break;
                    }
                    temp.append(s.charAt(j));
                    j++;
                }
                int num = Integer.parseInt(temp.toString());
                if(bigNum.isMinus){ // 최댓값 갱신 조건문
                    bigNum.isMinus = false;
                    bigNum.value = num;
                }
                else if(bigNum.value < num){
                    bigNum.value = num;
                }
                if(!smallNum.isMinus && num < smallNum.value){ //최솟값 갱신 조건문
                    smallNum.value = num;
                }
            }
        }
        
        if(smallNum.isMinus) answer.append('-');
        answer.append(smallNum.value + " ");
        if(bigNum.isMinus) answer.append('-');
        answer.append(bigNum.value);
        return answer.toString();
    }
    static class Num{
        boolean isMinus;
        int value;
        Num(boolean isMinus, int value){
            this.isMinus = isMinus;
            this.value = value;
        }
    } 
}

결과

정리

  • 문제 풀면서 음수인지 체크때문에 만든 클래스를 안만들고 할 수 있지 않을까 하는 의문이 들었다
  • 역시나 문자열을 s.split(" ")해서 문자열 배열에 저장한 후 parseInt하면 끝이었다.....
  • 정신 안차릴래?
  • 문자열 다루는 것에 대해 더 연습이 필요하다
  • 그래도 입출력 예시에는 없는 두 자리수 경우 생각해서 바로 접근했다
profile
안녕하세요! 개인 공부를 꾸준히 기록하는 공간입니다.

2개의 댓글

comment-user-thumbnail
2023년 7월 20일

정말 잘 읽었습니다, 고맙습니다!

1개의 답글