백준 1744 : 수 묶기
https://www.acmicpc.net/problem/1744
1. 접근
- 우선 오름차순을 해서 큰수끼리 묶어주면 된다.
- 큰양수는 큰양수끼리, 큰음수는 큰음수끼리 곱하는 것이 이득이다. (음수x양수 는 안됨)
- 양수와 음수로 나눠서 접근해본다면
=> 양수 : 큰 양수끼리 곱해야 한다. 1은 곱하는 것보다 더하는 것이 이득임
=> 음수 : 큰 음수끼리 곱해야 한다. 개수가 남는다면 0과 곱하는 것이 이득 - 수를 오름차순 정렬하면, 가장 끝에 양수가 있다. 따라서, 끝부터 줄여가면서 묶어준다. 0보다 작거나같으면 종료한다.
- 음수가 나오면, 새로운 반복문으로 0번째부터 묶어준다.
2. 추가 반례
10
-5
-4
-3
-2
-1
0
1
2
3
4
정답 : 41
2. 나의 풀이
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
vector<int> arr;
int input=0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> input;
arr.push_back(input);
}
sort(arr.begin(), arr.end());
int sum = 0;
int negativeIndex = n-1;
int i = 0;
for (i = n-1; i >=0; i--) { //큰 양수들끼리 묶어주기
if (arr[i] > 0) {
if (i > 0) {
if (arr[i - 1] <= 1) sum += arr[i]; //1은 더해주는게 이득
else {
sum += arr[i]*arr[i - 1];
i--;
}
}
else sum += arr[i];
}
else { //음수나 0이 나오면 종료
break;
}
}
negativeIndex = i+1; //반대쪽부터 여기까지 음수 반복문 돌릴거임
for (i = 0; i < negativeIndex; i++) { //작은 음수들끼리 묶어주기
if (i < negativeIndex - 1) {
sum += arr[i] * arr[i + 1];
i++;
}
else sum += arr[i];
}
cout << sum << "\n";
}
3. 다른 사람의 풀이
https://suhwanc.tistory.com/18
아예 양수와 음수 배열을 다르게 두고 각각에 대해 반복문을 쓰고,
1의 개수만 마지막에 따로 더해주는 방식을 썼다. (설명이 뭔가 웃겼음)
결론적으로 반복문을 2개 사용한다는 점에서, 효율성은 동일하다.
하지만, 묶어주는 과정을 깔끔하게 짤 수 있었다.
더 효율적인 방법인 것 같다.
Author And Source
이 문제에 관하여(백준 1744 : 수 묶기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jeongopo/백준-1744-수-묶기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)