[백준 C++] 5046 전국 대학생 프로그래밍 대회 동아리 연합

문제

백준이는 작년 전국 대학생 프로그래밍 대회 동아리 연합(이하 전대프연) 회의에 불참했기 때문에, 올해 회장으로 선출되었다.

전대프연 회장은 오프라인 대회를 가을에 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;
}

좋은 웹페이지 즐겨찾기