- Today
- Total
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- git error
- async
- http
- JavaScript
- es6
- git
- 그림으로 배우는 http&network
- 비동기
- 프론트엔드
- 자바스크립트
- 알고리즘
- React
- map
- deep dive
- 이터러블
- 네트워크
- 에러처리
- html
- 모던 자바스크립트
- 상태관리
- js
- Angular
- Java Script
- get
- 모던 자바스크립트 deep dive
- C++
- error
- 백준
- 웹
- 백준 실버
Archives
sharingStorage
백준 1758 - 알바생강호(c++, Greedy) 본문
https://www.acmicpc.net/problem/1758
문제 요약
알바생 강호가 줄선 손님들에게 팁을 받는다. 각 손님은 원래 주려했던 팁 금액 - (받은등수 -1) 만큼의 금액을
팁으로 준다. 위 식의 결과가 음수라면 강호는 그 손님에게 팁을 받을 수 없다.
사람의 수 N과, 각 사람이 주려고 생각하는 팁이 주어질 때, 손님의 순서를 적절히 바꿨을 때, 강호가 받을 수 잇는 팁의 최댓값을 구하는 프로그램을 작성하시오.
접근
큰 팁을 주려는 손님이 후 순위로 밀려나서 차감되는 금액이 커지면 최댓값과 멀어지므로 내림차순으로 정렬 후 각각의 값에서 (받은등수 -1)만큼 빼고 음수가 아닐때만 sum값에 더해주면 최대값을 얻을 수 있을 것라고 접근했다.
코드
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//무조건 팁 큰사람 앞으로
int N;
//int people[100001];
vector<int> people = {};
bool compare(int i, int j) {
return i > j;
}
int main() {
int x;
long long sum = 0;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> x;
people.push_back(x);
}
sort(people.begin(), people.end(), compare);
for (int i = 0; i < N; i++) {
if (people[i] - i > 0)
sum += people[i] - i;
}
cout << sum;
return 0;
}
풀이
팁을 많이 주는 사람이 뒤로갈수록 마이너스 되는 금액이 크고 팁을 적게주는 사람은 뒤로 가서 마이너스가 되더라도 팁이 음수가 되지 않기 때문에 내림차순으로 정렬 후 공식에서 음수가 아닌 값만 sum에 더했다. Greedy알고리즘으로 분류된다.
고찰
굉장히 쉬워보이는 문제지만 굉장히 쉽다. 접근방식은 옳았지만 하나 간과한 것이 있었다. 각 팁의 값이 100000이하의 자연수인데 그 값의 합을 받는 sum변수를 int로 선언하여 자료형의 범위를 초과했다. int형 변수의 범위는 –2,147,483,648 ~ 2,147,483,647 라는 것을 기억해두고 자료형의 크기를 신경쓰며 꼼꼼히 문제를 풀어야한다.
'알고리즘' 카테고리의 다른 글
백준 10816 - 숫자카드 2 (0) | 2023.08.18 |
---|---|
백준 18311 - 왕복 (0) | 2023.04.10 |
C++ STL priority_queue 우선순위큐 (0) | 2023.01.10 |
백준 1541 - 잃어버린 괄호 (0) | 2023.01.02 |
Comments