Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 구현하는 레스토랑 음식 주문 표시 테이블

레스토랑에서 손님들이 한 주문 내역을 담고 있는 배열 orders가 있다고 가정해 보겠습니다. 각 원소는 orders[i] = [cust_name_i, table_num_i, food_item_i] 형태로, 순서대로 고객 이름, 테이블 번호, 주문한 음식 메뉴를 의미합니다.

우리의 목표는 이 레스토랑의 “표시 테이블(display table)”을 만들어 반환하는 것입니다. 여기서 표시 테이블이란 각 테이블이 어떤 음식을 몇 개씩 주문했는지 보여주는 표입니다. 첫 번째 열에는 테이블 번호가 들어가고, 나머지 열들은 음식 이름들이 알파벳 순으로 정렬되어 배치됩니다. 또한 첫 행은 헤더 행이어야 하며, 첫 번째 칸은 “Table”, 이후 칸들에는 음식 이름들이 순서대로 들어갑니다.

예시

입력이 다음과 같다고 해보겠습니다.

orders = [["Amal","3","Paratha"],["Bimal","10","Biryni"],["Amal","3","Fried Chicken"],["Raktim","5","Water"],["Raktim","5","Paratha"],["Deepak","3","Paratha"]]

그렇다면 출력은 아래와 같습니다.

[["Table","Biryni","Fried Chicken","Paratha","Water"],["3","0","1","2","0"],["5","0","0","1","1"],["10","1","0","0","0"]]

해결 접근 방법

이 문제는 다음 단계를 따라 해결할 수 있습니다.

  • 음식 개수를 저장할 맵(map) m을 하나 정의합니다.

  • 음식 이름을 모아둘 집합(set) names를 정의합니다.

  • 테이블 번호를 모아둘 집합(set) t를 정의합니다.

  • 주문 목록의 각 원소 it에 대해 반복합니다.

    • it[1](테이블 번호)을 집합 t에 삽입합니다.

    • 플래그 ok := true로 설정합니다.

    • ok가 false라면:

      • it[2]를 공백 기준으로 분할하여 배열 v를 만듭니다.

      • v의 각 원소 x에 대해:

        • m[it[1], x] 값을 1 증가시킵니다.

        • x를 names에 삽입합니다.

    • 그렇지 않다면(else):

      • m[it[1], it[2]] 값을 1 증가시킵니다.

      • it[2]를 names에 삽입합니다.

  • 결과를 담을 2차원 배열 ret을 정의합니다.

  • names의 원소들을 복사한 배열 temp를 만듭니다.

  • temp의 맨 앞에 “Table”을 삽입합니다.

  • temp를 ret의 끝에 추가합니다.

  • 집합 t의 각 원소 it에 대해 반복합니다.

    • 배열 te를 정의하고, te의 끝에 it를 추가합니다.

    • names의 각 원소 x에 대해 te의 끝에 m[it, x]를 문자열로 변환해 추가합니다.

    • te를 ret의 끝에 추가합니다.

  • ret 배열을 정렬합니다.

  • ret을 반환합니다.

C++ 구현 예제

아래 구현 예제를 통해 더 잘 이해해 보겠습니다.

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<string> > v){
    cout << "[";
    for(int i = 0; i<v.size(); i++){
        cout << "[";
        for(int j = 0; j <v[i].size(); j++){
            cout << v[i][j] << ", ";
        }
        cout << "],";
    }
    cout << "]"<<endl;
}
typedef long long int lli;
class Solution {
public:
    vector <string> split(string& s, char delimiter){
        vector <string> tokens;
        string token;
        istringstream tokenStream(s);
        while(getline(tokenStream, token, delimiter)){
            tokens.push_back(token);
        }
        return tokens;
    }
    static bool cmp(vector <string>& a, vector <string>& b){
        lli an = stol(a[0]);
        lli bn = stol(b[0]);
        return an < bn;
    }
    vector<vector<string>> displayTable(vector<vector<string>>& o) {
        map <string, map < string, int> >m;
        set <string> names;
        set <string> t;
        for(auto &it : o){
            t.insert(it[1]);
            bool ok = true;
            if(!ok){
                vector <string> v = split(it[2], ' ');
                for(auto& x : v){
                    m[it[1]][x]++;
                    names.insert(x);
                }
            }
            else{
                m[it[1]][it[2]]++;
                names.insert(it[2]);
            }
        }
        vector < vector <string> > ret;
        vector <string> temp(names.begin(), names.end());
        temp.insert(temp.begin(), "Table");
        ret.push_back(temp);
        for(auto& it : t){
            vector <string> te;
            te.push_back(it);
            for(auto& x : names){
                te.push_back(to_string(m[it][x]));
            }
            ret.push_back(te);
        }
        sort(ret.begin() + 1, ret.end(), cmp);
        return ret;
    }
};
main(){
    Solution ob;
    vector<vector<string>> v = {{"Amal","3","Paratha"},{"Bimal","10","Biryni"},{"Amal","3","Fried
Chicken"},{"Raktim","5","Water"},{"Raktim","5","Paratha"},{"Deepak","3","Paratha"}};
    print_vector(ob.displayTable(v));
}

입력

{{"Amal","3","Paratha"},{"Bimal","10","Biryni"},{"Amal","3","Fried Chicken"},{"Raktim","5","Water"},{"Raktim","5","Paratha"},{"Deepak","3","Paratha"}}

출력

[[Table, Biryni, Fried Chicken, Paratha, Water],[3, 0, 1, 2, 0],[5, 0, 0, 1, 1],[10, 1, 0, 0, 0]]