학생회 행사 참여 인원을 조사하다가, 위와 같이 복수 응답으로 날짜를 투표 받았고
이렇게 50개가 넘는 응답을 받아 손수 정리하는 것의 한계를 느꼈다.
프로그램 개발해서 \n을 기준으로 응답자별로 응답한 날짜 객체를 분류해 배열에 넣고,
문자열 슬라이싱으로 날짜 정보를 추출해
해당 날짜를 선택한 사람의 정보를 입력하여,
Map으로 번호와 이름을 매칭시켜 이름을 출력하는 프로그램을 개발하였다.
이렇게 해서 손쉽게 정리를 할 수 있었다.
아래는 소스코드이다.
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <map>
#define MAX_LENGTH 45
#define _CRT_SECURE_NO_WARNINGS
#pragma warning 4996
#define n 35 // 참여한 학생 수
using namespace std;
map<int, string> stu = {
{ 0, "서보석" },
{ 1, "장재환" },
{ 2, "전현우" },
{ 3, "이병호" },
{ 4, "전동재" },
{ 5, "신명근" },
{ 6, "윤수아" },
{ 7, "한영채" },
{ 8, "김민주" },
{ 9, "김예은" },
{ 10, "김화현" },
{ 11 , "신유진" },
{ 12,"이다영" },
{ 13,"이재용" },
{ 14,"이재원" },
{ 15,"홍민기" },
{ 16,"김태원" },
{ 17,"남정우" },
{ 18,"여승헌" },
{ 19,"허지형" },
{ 20,"조한나" },
{ 21,"최지호" },
{ 22,"김가현" },
{ 23,"배관호" },
{ 24,"지현우" },
{ 25,"김동한" },
{ 26,"박세웅" },
{ 27,"박봄이" },
{ 28,"최수빈" },
{ 29,"정유나" },
{ 30,"박승우" },
{ 31,"신연하" },
{ 32,"최지훈" },
{ 33,"김예린" },
{ 34,"임진혁" },
{ 35,"정성훈" }
};
/*
1. 학생 수 41명에 대해서 가능한 날짜를 입력 받는다. 통째로 string으로 처리해받도록 한다.
2. ","을 기준으로 문자열 슬라이싱 처리, enum에 해당하는 Int를 반환받는다. 일치하는 studentsPerDate[i]에 학생의 number을 push_back() 한다.
3. map의 key를 기준으로 이름을 출력하면 끝
*/
vector<pair<int, int>> studentsPerDate[MAX_LENGTH]; // (점심or저녁, 학생의 번호)가 하나의 인덱스에 다수 존재한다.
vector<string> *datePerStudent;
bool lunchOrDinner;
vector<string> dates;
// "3월 15일(화) 저녁"의 형태로 날짜가 들어왔을 때,
// i번째 학생에게 들어온 input에대해 문자열 슬라이싱을 처리하여 가능한 날짜를 enum Type으로 저장한다. 어디에? studentsPerDate에!
void formatStringtoInt() {
// 학생의 순회를 돌며 각 string을 검토한다.
for (int i = 0; i < n; i++) {
for (int j = 0; j < datePerStudent[i].size(); j++) {
int date;
if (j == 0) {
date = ((datePerStudent[i][j][4] - '0')* 10 + (datePerStudent[i][j][5] - '0'));
}
else {
date = (( datePerStudent[i][j][5] - '0' ) * 10+ datePerStudent[i][j][6] - '0');
}
// i번째 학생이 희망하는 j번째 날짜
if (datePerStudent[i][j].find("점심") != string::npos) {
studentsPerDate[date].push_back(make_pair(0, i));
} // 12일 점심을 원하는 학생을 0, i 형태로 저장한다.
else if (datePerStudent[i][j].find("저녁")!= string::npos) {
studentsPerDate[date].push_back(make_pair(1, i));
}
}
}
}
// 콤마를 기준으로 datePerStudent 배열에 날짜를 입력받는 함수
void putDate(int i, char* allDate) {
char* context = NULL; // 분리된 후 남은 문자열이 들어간다.
//char* date = _strdup(allDate.c_str());
char* ptr = strtok_s(allDate, ",", &context);
while (ptr != NULL) {
datePerStudent[i].push_back(ptr);
ptr = strtok_s(NULL, ",", &context);
}
}
void input() {
datePerStudent = new vector<string>[n];
char allDate[200];
for (int i = 0; i < n; i++) {
//cin.getline(allDate, 200, '\n'); // 모든 date의 string을 받는다.
cin.getline(allDate, 200);
putDate(i, allDate);
}
}
void output(int start, int end) {
cout << "점심을 먹는 학우는 다음과 같습니다. " << endl;
for (int i = start; i <= end; i++) {
cout << i << "일 점심 : ";
for (int j = 0; j < studentsPerDate[i].size(); j++) {
if (studentsPerDate[i][j].first == 0) {// 점심인 경우
cout << stu[studentsPerDate[i][j].second] << " ";
}
}
cout << endl;
cout << i << "일 저녁 : ";
for (int j = 0; j < studentsPerDate[i].size(); j++) {
if (studentsPerDate[i][j].first == 1) {// 저녁인 경우
cout << stu[studentsPerDate[i][j].second] << " ";
}
}
cout << endl;
}
}
int main() {
input();
formatStringtoInt();
output(12, 18);
return 0;
}
'Algorithm' 카테고리의 다른 글
프림 알고리즘의 개념 (0) | 2022.03.21 |
---|---|
[C++] BFS와 DFS 개념 정리 (0) | 2022.03.14 |
그리디 알고리즘(Greedy Algorithm)의 개념, 예제 코드 (0) | 2022.03.06 |
[BOJ] 2217로프 : 그리디 알고리즘 C++ 문제 해결 및 코드 (0) | 2021.03.04 |
그리디(Greedy) 알고리즘이란? (0) | 2021.02.22 |