일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 혁펜하임강의후기
- C++ 백준
- 백준
- tensorflow
- C++
- C++ 함수
- 9095
- 1로만들기
- 백준C++
- 1463
- 백준9095
- 조건문
- 패스트캠퍼스혁펜하임
- 반복문
- pytorch
- c++ 기초
- for문
- CUDA
- 백준1463
- precision
- 혁펜하임강의
- 패스트캠퍼스
- 백준1026
- AI강의
- AIDEEPDIVE
- 혁펜하임
- 혁펜하임AI
- C++ 공백 입력
- cuDNN
- 비교연산자
- Today
- Total
코딩하는 덕구 🐶
68. C++ 백준 2217 로프 자세한 설명 본문
안녕하세요 코딩하는 덕구입니다.
C++ 백준 2217 번 로프입니다.
그리디 알고리즘 문제입니다.
https://www.acmicpc.net/problem/2217
2217번: 로프
N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하
www.acmicpc.net
로프들을 이용해 들어올릴 수 있는 최대 중량을 구하는 문제이므로
만약 로프 3개가 주어진다면
로프 1개가 들어올릴 수 있는 최대 중량,
로프 2개가 들어올릴 수 있는 최대 중량,
로프 3개가 들어올릴 수 있는 최대 중량을 비교해서 가장 높은 중량을 선택하면 되겠죠.
그럼 이 중량들은 어떻게 구하면 될까요?
로프 1개의 최대 중량은 로프들 중에 최대 중량이 가장 높은 로프를 선택하면 되겠죠.
로프 2개의 최대 중량은 로프들 중에 최대 중량이 가장 높은 순서대로 1번 로프, 2번 로프를 선택한 후
2번 로프의 최대 중량에 2를 곱하면 됩니다.
로프들 중에 가장 약한 로프가 버틸 수 있는 최대 중량까지 중량을 걸어야 최대 중량이기 때문이죠.
그럼 로프가 3개라면?
3개의 로프 중 가장 약한 로프가 버틸 수 있는 최대 중량 * 3을 해주면 됩니다.
i개라면?
i개 중 가장 약한 로프의 최대중량 * i가 되겠죠.
그럼 위의 직관을 가지고 코드를 구현해봅시다.
로프들을 배열 안에 저장한 후 내림차순으로 정렬합니다.
for(int i = 0; i<N; i++) cin >> ropes[i]; //로프 입력
sort(ropes, ropes+N, greater<int>()); //내림차순 정렬
각 로프의 개수마다 최대 중량을 저장할 배열 weights 입니다.
for(int i = 0; i<N; i++) weights[i] = ropes[i] * (i+1); //로프 개수별 최대 중량
ropes는 큰 수부터 작은 수 순서대로 정렬된 배열 이므로
ropes 안의 i번 째 로프는 i개의 로프 중 최대 중량이 가장 작은 로프가 되고,
i+1은 로프의 개수가 되므로 ropes[i] * (i+1)은
i+1개의 로프들을 이용한 최대 중량을 찾는 식이 됩니다.
이 값들을 로프들의 개수별 최대 중량을 저장할 weights 배열에 저장 한 후
가장 큰 값을 출력하면 답이 되겠죠
C++ 백준 2217 번 로프 최종 코드입니다.
#include <iostream>
#include <algorithm>
#define MAX 100001
using namespace std;
int ropes[MAX] ={0,};
int weights[MAX] ={0,};
int main(){
int N;
cin >> N;
for(int i = 0; i<N; i++) cin >> ropes[i]; //로프 입력
sort(ropes, ropes+N, greater<int>()); //내림차순 정렬
for(int i = 0; i<N; i++) weights[i] = ropes[i] * (i+1); //로프 개수별 최대 중량
cout << *max_element(weights, weights+N); //최대 값 리턴 값 주소이므로 *연산
return 0;
}
C++ 백준 2217 번 로프 자세한 설명이었습니다.
감사합니다.
'알고리즘 문제 풀이' 카테고리의 다른 글
70. C++ 백준 2606 번 바이러스 자세한 설명 (0) | 2023.01.05 |
---|---|
69. Python 백준 2606 번 바이러스 자세한 설명 (0) | 2023.01.05 |
67. Python 백준 2217 번 로프 자세한 설명 (0) | 2023.01.05 |
66. C++ 백준 1003 번 피보나치 함수 자세한 설명 (0) | 2023.01.04 |
65. Python 백준 1003 번 피보나치 함수 자세한 설명 (0) | 2023.01.04 |