c++ 코테/문제 풀기

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

케케_ 2024. 12. 4. 18:49

https://school.programmers.co.kr/learn/courses/30/lessons/12939

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

내코드

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

string solution(string s) {
    string answer = "";
    vector<int> str = {};
    int cul=0;
    for (int i = 0 ; i < s.size(); i++) {
        if (s[i] == ' ') {
            string a = s.substr(cul, i-cul);
            str.push_back(stoi(a));
            cul = i+1;
        }
    }
    string a = s.substr(cul);   // 마지막 값
    str.push_back(stoi(a));

    int min = *min_element(str.begin(), str.end());
    int max = *max_element(str.begin(), str.end());
    
    answer += to_string(min);
    answer += " ";
    answer += to_string(max);

    cout << answer;
    return answer;
}

int main() {
    string str = "-1 -1";
    string result = solution(str);
    
    return 0;
}

 

 

 

지피티 코드

작성하신 코드는 주어진 문자열에서 공백을 기준으로 숫자를 분리한 뒤, 최소값과 최대값을 구하는 작업을 잘 수행하고 있습니다. 하지만 코드에서 가독성 향상간결성을 위해 몇 가지 개선이 가능합니다.


주요 개선 사항

  1. istringstream 사용:
    • istringstream을 사용하면 문자열을 공백 기준으로 분리하는 작업이 더 간단해집니다.
    • 현재 cul을 사용한 문자열 분리 작업을 더 간결하게 표현할 수 있습니다.
  2. 직접 비교를 통한 최소/최대값 계산:
    • min_element와 max_element 대신, 숫자를 읽어들이며 동시에 최소값과 최대값을 계산하면, 벡터를 추가적으로 생성하지 않아도 됩니다.
    • 이를 통해 공간 효율성을 향상시킬 수 있습니다.
  3. string 리터럴 사용:
    • answer를 += 연산으로 계속 연결하는 대신, 문자열 포맷팅을 한 번에 처리하면 성능이 조금 더 향상됩니다.

개선된 코드

#include <string>
#include <sstream>
#include <iostream>
#include <limits>
using namespace std;

string solution(string s) {
    istringstream iss(s);
    int num, minVal = numeric_limits<int>::max(), maxVal = numeric_limits<int>::min();

    // 문자열을 공백 기준으로 분리하며 최소값과 최대값 계산
    while (iss >> num) {
        minVal = min(minVal, num);
        maxVal = max(maxVal, num);
    }

    // 결과 문자열 생성
    return to_string(minVal) + " " + to_string(maxVal);
}

int main() {
    string str = "-1 -1";
    string result = solution(str);
    cout << "Result: " << result << endl;
    return 0;
}

개선된 코드의 장점

  1. 문자열 분리 간소화:
    • istringstream을 사용해 문자열을 공백 기준으로 간단히 분리할 수 있습니다.
    • 더 이상 cul 변수를 사용할 필요가 없습니다.
  2. 벡터 제거:
    • 입력 값을 저장할 벡터(vector<int> str)를 없애고, 최소값과 최대값을 계산하면서 바로 업데이트합니다.
    • 공간 효율성이 개선됩니다.
  3. 가독성 향상:
    • 불필요한 연산(substr 호출, stoi로 벡터 저장 후 다시 검색)을 제거해 코드가 간결해졌습니다.
  4. 최대/최소값 초기화:
    • numeric_limits<int>::max()와 numeric_limits<int>::min()를 사용해 직관적으로 초기값을 설정했습니다.

입력 및 출력 예시

입력

s = "-1 -1"

출력

Result: -1 -1

입력

s = "1 2 3 4"

출력

Result: 1 4

입력

s = "-10 -20 -30 0 10 20"

출력

Result: -30 20

시간 및 공간 복잡도

  1. 시간 복잡도:
    • istringstream을 사용해 문자열을 분리하며 한 번만 순회하므로 O(N)O(N).
  2. 공간 복잡도:
    • 벡터를 사용하지 않아, 입력 문자열 크기와 상관없이 O(1)O(1) 추가 공간만 필요.

요약

  • istringstream을 사용하면 문자열 분리 작업을 간소화할 수 있습니다.
  • 최소/최대값을 바로 계산하므로 추가적인 벡터 사용 없이 더 효율적으로 동작합니다.
  • 코드가 더 읽기 쉽고 직관적이 되어 유지보수성이 향상됩니다.

추가적인 질문이나 더 궁금한 점이 있으면 언제든 말씀해주세요! 😊

'c++ 코테 > 문제 풀기' 카테고리의 다른 글

프로그래머스 지폐접기 - 340199  (1) 2024.12.03