byworld 님의 블로그
20260430 프로그래머스 최댓값 만들기(2) 본문
[서론]
쉬운 문제지만 나보다 시간 효율적인 다른 사람 코드가 안보여서 가져왔다.
https://school.programmers.co.kr/learn/courses/30/lessons/120862
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
[오늘의 추천곡] 체리필터 - 낭만고양이
나는 낭만이 실용보다 중요하다고 생각하는 사람이다. 뭐 낭만이 아니라 충동이라고 할 수도 있다. 물론 대부분의 일을 실용 기준으로 하긴 하지만... 다 먹고 살자고 하는 것 아닌가? 돈도 솔직히 별로 연연하지는 않다. 주식을 해서 그런가 얼마 벌고 잃고 하는 것에 감정적 관심이 없다. 세상이 가짜같아 보이기도 하고. 그냥 내 맘대로 살거다. Follow your heart!!
https://youtu.be/h3XVYav2SQs?list=RDh3XVYav2SQs
[문제 풀이]
쉬운 문제지만 나보다 시간 효율적인 다른 사람 코드가 안보여서 가져왔다. 내 코드는 이러하다.
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> numbers) {
int answer = 0;
int max=-100000;int smax=-99999;
int min=100000;int smin=99999;
for(int k:numbers){
if(k>max){
smax=max;
max=k;
}else if(k>smax){
smax=k;
}
if(k<min){
smin=min;
min=k;
}else if(k<smin){
smin=k;
}
}
return min*smin>max*smax?min*smin:max*smax;
}
발상은 이렇다. 두 수를 곱해서 최대를 만들려면 가장 큰 두 수를 곱하거나 가장 작은 두 수를 곱해야한다.
이 중에서 의문점이 있을 수 있는 게 음수가 하나라면? 음수에 양수나 0에서 가장 작은 것을 곱해야 가장 큰 곱이 나오니까, 결국 가장 작은 두 개를 곱하면 된다. 결국 내 발상 대로 하면 된다.
그러면 어떻게 가장 큰, 가장 작은 두 수를 구할건가? 코드에서 있다시피 기존 min, max를 구하고, smin, smax로 세컨드를 만들어서 민맥스가 나오면 sminmax는 minmax를 받아오고, minmax보다 작거나 같은 값이라면 sminmax에 해당 숫자를 대입하면 된다. 또 의문점이 중복되는 값이면 어쩌나? 부등호 조건 맞나 할 수 있다. 예를 들어 [5,5,-1] 같은 숫자는 안되지 않나? 결론은 된다. 왜냐하면 else if k>max에서 중복되어도 받아주기 때문이다. 나는 max() 함수 대신 삼항 연산자로 return을 했다.
다른 사람이 푼 예시 코드는 이렇다.
#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]);
}
겉보기에는 더 간단하지만 시간 복잡도는 내가 더 좋다. 왜냐하면 이 코드는 sort를 하기 때문이다. O(nlogn) 시간이 걸린다. 나는 O(n) 시간에 풀었다. 사실 프로그래머스에서는 시간 복잡도를 잘 안따지는 것 같고 효율보다 가독성이 더 좋은 코드를 선호하는 것 같긴 하다. 내 코드도 뭐 숫자 개판이고 가독성 개판이고 하지만 귀찮아서 이대로 할거다.
'TIL' 카테고리의 다른 글
| mysql 자주쓰는 함수들 정리 (0) | 2026.05.10 |
|---|---|
| 개발 문화/협업에서 자주 쓰는 용어 정리 (1) | 2026.05.08 |
| 20260501 나선형(달팽이) 배열 (0) | 2026.05.01 |
| 20260430 프로그래머스 기초 문제 다 부숴버리기 (0) | 2026.04.29 |
| 20260429 HTTP 상태 코드와 400 vs 422 사이에서의 고민 (0) | 2026.04.29 |