Lv 0. 최댓값 만들기 (2). *다시 풀어보기* - 더 간결하게

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

 

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

using namespace std;

int solution(vector<int> numbers) {
    int answer = 0;
    sort(numbers.begin(),numbers.end());
    if(numbers.size()==2){
        answer=numbers[0]*numbers[1];
    }
    else{
        int tmp1=numbers[numbers.size()-1]*numbers[numbers.size()-2];
        int tmp2=numbers[0]*numbers[1];
        answer=max(tmp1,tmp2);
    }
    return answer;
}

위의 풀이의 경우 내가 작성한 코드이다. 

풀이를 생각해보자면, 정렬을 한 뒤에, 사이즈가 2라면, 두개의 원소만 존재하므로 그냥 두 원소를 곱한걸 출력하고, 만약 2개가 아니라면, 즉 3개 이상이라면 가장 작은 원소 두개의 곱이거나, 혹은 가장 큰 원소 두개의 곱 중에서, 더 큰 값을 answer 로 리턴 하면 되는 형태의 코드인데, 다른 사람의 풀이를 보니까 이와 같은 형태의 코드이면서 더욱 간결하고 이해하기 쉽게, 그리고 불필요한 if else 판별을 사용하지 않는 코드를 보게 되어서 여기에 첨부한다. 

numbers.size()==2 이더라도, 가장 작은 원소 두개이거나, 혹은 numbers.size()-1, numbers.size()-2의 위치의 numbers 배열에 접근하는건 결국 같은 값을 나타내기 때문에 위의 코드처럼 if , else로 구분지어서 코드를 작성해줄 필요가 없는 것이었다. 

 

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

using namespace std;

int solution(vector<int> numbers) {
    sort(numbers.begin(),numbers.end());    
    int n = numbers.size();
    return max(numbers[n-1]*numbers[n-2],numbers[0]*numbers[1]);
}

이렇게 작성하는것이 훨씬 갈끔하고 이해하기 쉽고, 원하는 형태의 프로그램을 제공하는 아주 멋진 코드이다. 이런 식으로 생각해보도록 노력하자. 이런 식의 코드를 짜기 위해서 노력해보도록 하자. 

 

  Comments,     Trackbacks