백준이는 작년 전국 대학생 프로그래밍 대회 동아리 연합(이하 전대프연) 회의에 불참했기 때문에, 올해 회장으로 선출되었다.
전대프연 회장은 오프라인 대회를 가을에 1회 개최해야 한다. 백준이는 대회를 개최할 주말을 마음대로 고를 수 있고, 회원들이 머무를 호텔을 찾아야 한다. 전대프연의 자금 사정은 넉넉하지 않기 때문에, 되도록 싼 호텔을 찾아야 한다.
여행의 총 비용은 예산을 초과하면 안 된다. 모든 회원은 같은 호텔에서 머물러야 한다. 작년에 모든 회원이 같은 호텔에 머무르지 않았고, 이로인해 대재앙이 일어났다. 일부 회원은 길을 잃어버렸고, 아직까지 그들을 다시 본 사람은 없다.
첫째 줄에 참가자의 수 1 ≤ N ≤ 200, 예산 1 ≤ B ≤ 500000, 호텔의 수 1 ≤ H ≤ 18, 고를 수 있는 주의 개수 1 ≤ W ≤ 13이 주어진다. 다음 줄부터 각 호텔의 정보가 주어지며, 호텔의 정보는 두 줄로 이루어져 있다. 첫 번째 줄에는 그 호텔의 일인당 숙박비용 1 ≤ p ≤ 10000이 주어지고, 둘째 줄에는 i번째 주에 투숙 가능한 인원 0 ≤ a ≤ 1000이 주어진다.
첫째 줄에 대회를 개최할 수 있으면 최소 비용을 출력하고, 없으면 "stay home"을 출력한다.
https://www.acmicpc.net/problem/5046
딱히 사용되는 알고리즘없이 투숙인원이맞을 경우 최소금액을 계산후, 해당 최소금액이 주어진 금액보다 작거나같으면 금액을, 아니면 stay home을 출력하면된다.
처음코드를짤때 주마다 수용가능인원을 2차원배열에 넣게 코드를 짰으나, 그럴필요없이 std::cin으로 입력받자마자 체크후 가능하면 최소금액을 산출하게 짰으면됬다. 그래서 수정하고 수정한결과
#include <iostream>
using namespace std;
int person, money;
int** hotel;
int* hotelpay;
int main() {
int hotelnum, hotelweeknum;
cin >> person >> money >> hotelnum >> hotelweeknum;
hotelpay = new int[hotelnum];
hotel = new int*[hotelnum];
int cheapPay = 0x7fffffff;
for (int i = 0; i < hotelnum; i++) {
hotel[i] = new int[hotelweeknum];
cin >> hotelpay[i]; //가격 기록
bool stayhome = false;
for (int j = 0 , temp; j < hotelweeknum; j++) { //??? 변수선언?
cin >> temp; //주마다 인원제한 기록
if (temp < person) { //인원제한이 전체인원보다 작을시
stayhome = true;
}
else {
hotel[i][j] = temp;
}
}
int totalpay = person * hotelpay[i];
if (stayhome == false && totalpay < cheapPay) {
cheapPay = totalpay;
}
}
if (cheapPay > money) {
cout << "stay home";
}
else {
cout << cheapPay;
}
return 0;
}
이러한 코드가 나왔으나.. 예제를 테스트한결과 출력이 동일하나, 백준에서는 틀렸다고 나와서 한참을 고민했다.
for (int i = 0, hotelpay, totalpay = 0; i < hotelnum; i++) {
cin >> hotelpay; //가격 기록
for (int j = 0 , temp; j < hotelweeknum; j++) { //??? 변수선언?
cin >> temp; //주마다 인원제한 기록
if (temp >= person) { //인원제한이 전체인원보다 크면 가능하다.
totalpay = person * hotelpay;
}
}
if (totalpay != 0 && cheapPay > totalpay) {
cheapPay = totalpay;
}
}
for문 내부를 이렇게 수정했더니 정답이었다.
아마 if(temp < person){ stayhome = true } 코드의 조건을 바꾸어서 인원이되는 모든경우 최솟값을 저장하게하는 코드로 바꾸었더니 맞췄다.
전체코드
#include <iostream>
using namespace std;
int person, money;
int main() {
int hotelnum, hotelweeknum;
cin >> person >> money >> hotelnum >> hotelweeknum;
int cheapPay = 0x7fffffff;
for (int i = 0, hotelpay, totalpay = 0; i < hotelnum; i++) {
cin >> hotelpay; //가격 기록
for (int j = 0 , temp; j < hotelweeknum; j++) { //??? 변수선언?
cin >> temp; //주마다 인원제한 기록
if (temp >= person) { //인원제한이 전체인원보다 크면 가능하다.
totalpay = person * hotelpay;
}
}
if (totalpay != 0 && cheapPay > totalpay) {
cheapPay = totalpay;
}
}
if (cheapPay > money) {
cout << "stay home";
}
else {
cout << cheapPay;
}
return 0;
}