본문 바로가기

프로그래밍 언어/C, C++

[Hackerrank] 29. Hotel Prices

29. Hotel Prices

[ 난이도: Medium | 분야: Debugging ]

1. 과제

이번 챌린지에서는 제공된 모든 테스트 파일들을 성공적으로 실행하기 위한 코드를 디버깅하는 것이다.

기본적인 호텔방과 호텔 아파트를 나타내는 HotelRoom 클래스와 HotelApartment가 있다.

이 클래스들은 두 파라미터를 가진다: bedrooms 그리고 bathrooms

각각 방의 침실 수와 화장실 수를 나타낸다.

기본적인 호텔 방과 호텔 아파트 가격은 다음과 같다:

- 호텔 방: 50 침실 + 100 화장실

- 호텔 아파트: 같은 침실, 화장실의 수를 갖는다고 가정한다면 100 정도 비싸다

예를 들어, 만약 기본 방의 가격이 200이라면, 같은 수의 침실과 화장실이 있는 아파트는 가격이 300이다.

호텔의 codebase에는 오늘 예약된 방 리스트를 읽는 코드가 있고 호텔 수익의 총액을 계산 해준다.

하지만, 계산된 수익은 간혹 원래보다 작게 나올 때가 있다.

HotelRoom 클래스와 HotelApartment 클래스의 implementation을 디버기하여 수익의 총액을 올바르게 계산하도록 하라.

이 챌린지의 함수는 여러 케이스에 대입될 예정이다.

입력 형식

입력은 코드 탬플릿의 잠겨있는 부분에서 읽는다.

첫 번째 줄은, 오늘 예약된 방의 개수인 n을 가지고 있다.

이후 n개의 줄이 있다. 각 줄들은 room_type으로 시작한다.(standard와 apartment 중 하나를 갖는다.) 그리고 이 방이 갖고 있는 침실의 개수와 화장실의 개수가 이어서 나온다.

 

제약 사항

n은 1보다 크거나 같고 100보다 작거나 같다.

각 방에는 최소 1개, 최대 5개의 침실이 있다.

각 방에는 최소 1개, 최대 5개의 화장실이 있다.

 

출력 형식

출력은 코드 탬플릿의 잠겨 있는 부분에서 처리해준다. 입력에서 읽어온 모든 방의 벡터들로부터 반복하며 총 수익을 계산한다.

 

입력 예시0

2
standard 3 1
apartment 1 1

 

출력 예시0

500

 

설명0

샘플에서 우리는 침실 3개와 화장실 한 개를 가지고 있는 한 개의 standard room과 한 개의 침실과 한 개의 화장실이 있는 아파트가 있다. standard room의 가격은 3*50 + 100 = 250이다. 아파트의 가격은 50 + 100 + 100 = 250이다.

따라서 호텔의 수익은 250 + 250 = 500이다.

 

문제


#include <iostream>
#include <vector>

using namespace std;

class HotelRoom {
public:
    HotelRoom(int bedrooms, int bathrooms) 
    : bedrooms_(bedrooms), bathrooms_(bathrooms) {}
    
    int get_price() {
        return 50*bedrooms_ + 100*bathrooms_;
    }
private:
    int bedrooms_;
    int bathrooms_;
};

class HotelApartment : public HotelRoom {
public:
    HotelApartment(int bedrooms, int bathrooms) 
    : HotelRoom(bedrooms, bathrooms) {}

    int get_price() {
        return HotelRoom::get_price() + 100;
    }
};

int main() {
    int n;
    cin >> n;
    vector<HotelRoom*> rooms;
    for (int i = 0; i < n; ++i) {
        string room_type;
        int bedrooms;
        int bathrooms;
        cin >> room_type >> bedrooms >> bathrooms;
        if (room_type == "standard") {
            rooms.push_back(new HotelRoom(bedrooms, bathrooms));
        } else {
            rooms.push_back(new HotelApartment(bedrooms, bathrooms));
        }
    }

    int total_profit = 0;
    for (auto room : rooms) {
        total_profit += room->get_price();
    }
    cout << total_profit << endl;

    for (auto room : rooms) {
        delete room;
    }
    rooms.clear();

    return 0;
}
더보기

정답

#include <iostream>
#include <vector>

using namespace std;

class HotelRoom {
public:
    HotelRoom(int bedrooms, int bathrooms) 
    : bedrooms_(bedrooms), bathrooms_(bathrooms) {}
    
    virtual int get_price() {
        return 50*bedrooms_ + 100*bathrooms_;
    }
private:
    int bedrooms_;
    int bathrooms_;
};

class HotelApartment : public HotelRoom {
public:
    HotelApartment(int bedrooms, int bathrooms) 
    : HotelRoom(bedrooms, bathrooms) {}

    int get_price() {
        return HotelRoom::get_price() + 100;
    }
};

int main() {
    int n;
    cin >> n;
    vector<HotelRoom*> rooms;
    for (int i = 0; i < n; ++i) {
        string room_type;
        int bedrooms;
        int bathrooms;
        cin >> room_type >> bedrooms >> bathrooms;
        if (room_type == "standard") {
            rooms.push_back(new HotelRoom(bedrooms, bathrooms));
        } else {
            rooms.push_back(new HotelApartment(bedrooms, bathrooms));
        }
    }

    int total_profit = 0;
    for (auto room : rooms) {
        total_profit += room->get_price();
    }
    cout << total_profit << endl;

    for (auto room : rooms) {
        delete room;
    }
    rooms.clear();

    return 0;
}

 

 

 

 

 

©️Hackerrank. All Rights Reserved.