레스토랑에서 손님들이 한 주문 내역을 담고 있는 배열 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]]