백준/그리디
백준 1082 c++ "방 번호" -PlusUltraCode-
PlusUltraCode
2025. 5. 25. 15:17
https://www.acmicpc.net/problem/1082
[필자 사고]
첫째자리 오는 수는 0이 올수 없기때문에 이 부분 주의해야 한다.
먼저 필자는 가장 작은 값어치를 찾아야 했다.
실제 인덱스가 0인 경우와 아닌 경우 둘다 찾았다.
그다음 resultArr배열에 첫재짜리만 따로 넣어준뒤 반복문을 이용하여 최소비용으로 만들 수 있는
최대 자릿수를 알아냈다.
그다음 전체 반복문을 조회하여 해당 인덱스보다 큰 인덱스인데 값어치가 아직 여유있는 경우들을 하나씩 바꿔나갔다.
아래는 자세한 코드 해설이다.
[코드 해설]
1. 입력 단계
- 먼저 사용할 수 있는 숫자의 개수를 입력받고, 각 숫자를 사용하기 위한 비용을 벡터에 저장합니다.
- 그리고 사용할 수 있는 총 금액을 입력받습니다.
2. 가장 저렴한 숫자 두 개를 찾음
- 모든 숫자 중 가장 비용이 적은 숫자를 찾습니다. 이건 반복적으로 사용할 숫자를 결정할 때 기준이 됩니다.
- 또한, 가장 앞자리에 오는 숫자는 0이면 안 되므로, 0번 숫자를 제외하고 가장 저렴한 숫자도 따로 찾습니다.
3. 첫 자릿수 결정
- 가장 앞자리에 올 수 있는 가장 저렴한 숫자가 현재 가진 돈으로 살 수 없다면, 어떤 숫자도 만들 수 없기 때문에 프로그램은 0을 출력하고 종료합니다.
- 만약 살 수 있다면, 그 숫자를 첫 자리에 넣고 해당 비용만큼 총 금액에서 차감합니다.
4. 가능한 한 많은 숫자 구매
- 그 다음으로는 가장 저렴한 숫자를 이용해 남은 돈으로 최대한 많은 숫자를 구매하여 숫자의 전체 길이를 최대화합니다.
5. 숫자 업그레이드
- 이제 만들어진 각 자릿수 숫자를 더 큰 숫자로 바꿀 수 있는지 하나씩 확인합니다.
- 각 자리를 오른쪽에서부터가 아니라 왼쪽부터, 그리고 가능한 숫자 중 가장 큰 값부터 시도합니다.
- 만약 현재 자리에 들어간 숫자를 더 큰 숫자로 바꾸는 데 드는 추가 비용이 남은 금액 내라면, 해당 자릿값을 더 큰 숫자로 바꾸고, 그만큼 금액을 다시 차감합니다.
- 이 과정을 모든 자리수에 대해 반복하여 숫자를 최대한 크게 만듭니다.
[소스 코드]
#include <iostream>
#include <vector>
#include <algorithm>
#define INF 987654321
using namespace std;
int N, M;
vector<int> arr;
vector<int> arr2;
vector<int> resultArr;
void Input() {
cin >> N;
for (int i = 0; i < N; i++) {
int num;
cin >> num;
arr.push_back(num);
}
cin >> M;
}
void Game_Start() {
int firstValue = INF; int secondValue = INF;
int firstIdx, secondIdx;
for (int i = 0; i < arr.size(); i++) {
if (firstValue > arr[i]) {
firstValue = arr[i];
firstIdx = i;
}
if (i != 0 && secondValue > arr[i]) {
secondValue = arr[i];
secondIdx = i;
}
}
if (secondValue > M) {
cout << '0';
return;
}
M -= secondValue;
resultArr.push_back(secondIdx);
while (M > 0) {
int diff = M - firstValue;
if (diff < 0)break;
resultArr.push_back(firstIdx);
M -= firstValue;
}
for (int i = 0; i < resultArr.size(); i++) {
for (int j = N - 1; j >= 0; j--) {
int diff = arr[j] - arr[resultArr[i]];
if (diff <= M) {
resultArr[i] = j;
M -= diff;
break;
}
}
}
for (int i = 0; i < resultArr.size(); i++) {
cout << resultArr[i];
}
}
int main(void) {
Input();
Game_Start();
}