본문 바로가기
백준/정렬

백준 2217 c++ "로프" -PlusUltraCode-

by PlusUltraCode 2025. 9. 17.

https://www.acmicpc.net/problem/2217

[필자 사고]

처음에 가장 작은값을 구한다음 배열의 갯수를 곱하면 문제가 해결될 줄 알았다.

잠시 고민해본 뒤 꼭 모든 줄을 사용할 필요가 없었다.

그래서 내림차순으로 정렬한 뒤 하나하나 최대로 버틸수 있는 무게를 구해서 비교를 해주었다.

 

아래는 자세한 코드 해설이다.

[코드 해설]

cmp 함수

  • bool cmp(int a, int b)
  • 정렬 기준을 정의하는 함수입니다.
  • a > b 조건을 반환하므로, 내림차순 정렬을 수행합니다.

main 함수

  1. 입출력 최적화 설정
    • ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) 으로 빠른 입출력을 설정합니다.
  2. 입력 처리
    • 정수 N을 입력받음.
    • for문을 통해 N개의 로프의 최대 하중을 입력받아 arr 벡터에 저장.
  3. 정렬
    • sort(arr.begin(), arr.end(), cmp)
    • arr 벡터를 내림차순으로 정렬합니다.
    • 즉, 가장 강한 로프부터 가장 약한 로프 순서대로 정렬됩니다.
  4. 최대 하중 계산
    • maxResultWeight 변수를 -1로 초기화.
    • for문으로 각 로프를 확인하면서, 해당 로프와 그보다 강한 로프들을 함께 사용할 때의 하중을 계산.
    • nowNum = arr[i] → 현재 로프의 하중.
    • maxNowWeight = nowNum * (i + 1)
      • 현재 로프를 포함해 (i+1)개의 로프를 사용했을 때의 총 하중.
    • maxResultWeight = max(maxResultWeight, maxNowWeight)
      • 지금까지 구한 최대값과 비교해 더 큰 값을 저장.
  5. 출력
    • 최종적으로 가능한 최대 하중을 출력합니다.

[소스 코드]

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

using namespace std;

int N;
vector<int> arr;

bool cmp(int a, int b) {
	return a > b;
}

int main(void) {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> N;
	for (int i = 0; i < N; i++) {
		int num;
		cin >> num;
		arr.push_back(num);

	}
	sort(arr.begin(), arr.end(), cmp);
	
	int maxResultWeight = -1;

	for (int i = 0; i < arr.size(); i++) {
		int nowNum = arr[i];

		int maxNowWeight = nowNum * (i + 1);
		maxResultWeight = max(maxResultWeight, maxNowWeight);
	}

	cout << maxResultWeight;
}