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

이성훈·2021년 11월 2일
0

문제

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

전대프연 회장은 오프라인 대회를 가을에 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;
}
profile
I will be a socially developer

0개의 댓글