#include <iostream>
#include <map>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
// 학생 ID별 과목 점수 관리 (map 활용)
map<int, map<string, int>> studentScores;
// 과목별 학생 점수 관리 (vector 활용)
map<string, vector<pair<int, int>>> subjectScores;
// 특정 과목의 점수 정렬을 위한 set (점수 내림차순, ID 오름차순)
map<string, set<pair<int, int>, greater<pair<int, int>>>> sortedSubjectScores;
// 학생 성적 추가 (점수 갱신 포함)
void addScore(int id, string subject, int score) {
if (score < 0 || score > 100) {
cout << "점수는 0~100 사이여야 합니다!\n";
return;
}
// 기존 점수 갱신
studentScores[id][subject] = score;
// 과목별 점수 리스트에서 학생 ID가 있으면 갱신
bool found = false;
for (auto& p : subjectScores[subject]) {
if (p.first == id) {
p.second = score;
found = true;
break;
}
}
if (!found) {
subjectScores[subject].push_back({ id, score });
}
// set에 점수 갱신 (기존 값 삭제 후 새 값 추가)
sortedSubjectScores[subject].erase({ score, id });
sortedSubjectScores[subject].insert({ score, id });
cout << id << "번 학생 " << subject << " 점수 등록 완료: " << score << "점\n";
}
// 특정 학생의 전체 성적 조회
void viewStudentScores(int id) {
if (studentScores.find(id) == studentScores.end()) {
cout << "학생 " << id << "의 성적 정보가 없습니다.\n";
return;
}
cout << "학생 " << id << " 성적 목록:\n";
for (auto& it : studentScores[id]) {
cout << "- " << it.first << ": " << it.second << "점\n"; // 과목명: 점수
}
}
// 전체 학생의 과목별 평균 점수 출력
void printAverageScores() {
if (subjectScores.empty()) {
cout << "등록된 성적이 없습니다.\n";
return;
}
cout << "과목별 평균 점수:\n";
for (auto& subject : subjectScores) {
double total = 0;
int count = subject.second.size();
for (auto& p : subject.second) {
total += p.second;
}
double avg = total / count;
cout << "- " << subject.first << ": " << avg << "점\n";
}
}
// 특정 과목의 최고 점수 학생 조회 (동점자 포함)
void highestScoreStudent(string subject) {
if (sortedSubjectScores.find(subject) == sortedSubjectScores.end() || sortedSubjectScores[subject].empty()) {
cout << subject << " 과목의 성적 데이터가 없습니다.\n";
return;
}
int maxScore = sortedSubjectScores[subject].begin()->first;
cout << subject << " 최고 점수: " << maxScore << "점 (학생 ID: ";
bool first = true;
for (auto& p : sortedSubjectScores[subject]) {
if (p.first == maxScore) {
if (!first) cout << ", ";
cout << p.second;
first = false;
}
else {
break;
}
}
cout << ")\n";
}
// 특정 과목에서 점수 구간에 해당하는 학생 조회
void searchScoreRange(string subject, int minScore, int maxScore) {
if (subjectScores.find(subject) == subjectScores.end()) {
cout << subject << " 과목의 성적 데이터가 없습니다.\n";
return;
}
cout << subject << "에서 " << minScore << " ~ " << maxScore << "점 학생 목록:\n";
bool found = false;
for (auto& p : subjectScores[subject]) {
if (p.second >= minScore && p.second <= maxScore) {
cout << "- 학생 ID: " << p.first << ", 점수: " << p.second << "점\n";
found = true;
}
}
if (!found) cout << "해당 점수 구간에 있는 학생이 없습니다.\n";
}
// 메뉴 시스템
void menu() {
while (true) {
cout << "\n학생 성적 관리 시스템\n";
cout << "1. 학생 성적 추가\n";
cout << "2. 학생 성적 조회\n";
cout << "3. 과목별 평균 점수 출력\n";
cout << "4. 과목별 최고 점수 학생 조회\n";
cout << "5. 특정 점수 구간 학생 조회\n";
cout << "6. 종료\n";
cout << "선택: ";
int choice;
cin >> choice;
if (choice == 1) {
int id, score;
string subject;
cout << "학생 ID, 과목, 점수를 입력하세요 (예: 1001 C++ 85): ";
cin >> id >> subject >> score;
addScore(id, subject, score);
}
else if (choice == 2) {
int id;
cout << "조회할 학생 ID를 입력하세요: ";
cin >> id;
viewStudentScores(id);
}
else if (choice == 3) {
printAverageScores();
}
else if (choice == 4) {
string subject;
cout << "조회할 과목을 입력하세요: ";
cin >> subject;
highestScoreStudent(subject);
}
else if (choice == 5) {
string subject;
int minScore, maxScore;
cout << "조회할 과목과 점수 구간을 입력하세요 (예: C++ 80 90): ";
cin >> subject >> minScore >> maxScore;
searchScoreRange(subject, minScore, maxScore);
}
else if (choice == 6) {
cout << "프로그램을 종료합니다.\n";
break;
}
else {
cout << "올바른 숫자를 입력하세요!\n";
}
}
}
int main() {
menu();
return 0;
}
1. 코드 개요
기능 | 설명 |
학생 성적 추가 | 학생 ID, 과목, 점수를 저장 (동일 과목 입력 시 점수 갱신) |
학생 성적 조회 | 특정 학생의 모든 성적을 조회 |
과목별 평균 점수 출력 | 각 과목의 평균 점수를 계산 후 출력 |
과목별 최고 점수 학생 조회 | 특정 과목에서 최고 점수를 받은 학생 ID 조회 |
특정 점수 구간 학생 조회 | 특정 과목에서 점수가 지정된 범위에 속하는 학생 조회 |
2. STL 컨테이너 선택 이유
컨테이너사용 목적설명
컨테이너 | 사용 목적 | 설명 |
map<int, map<string, int>> | 학생별 성적 관리 | 학생 ID별로 과목과 점수를 저장 (studentScores) |
map<string, vector<pair<int, int>>> | 과목별 성적 관리 | 과목별로 학생 ID와 점수를 저장 (subjectScores) |
map<string, set<pair<int, int>, greater<pair<int, int>>>> |
과목별 성적 정렬 | 점수 내림차순 + 학생 ID 오름차순 정렬 (sortedSubjectScores) |
3. 코드 상세 설명
(1) 학생 성적 저장을 위한 자료구조
// 학생 ID별 과목 점수 관리 (학생 기준 조회)
map<int, map<string, int>> studentScores;
// 과목별 학생 점수 관리 (과목 기준 조회)
map<string, vector<pair<int, int>>> subjectScores;
// 특정 과목의 점수 정렬을 위한 set (점수 내림차순, ID 오름차순)
map<string, set<pair<int, int>, greater<pair<int, int>>>> sortedSubjectScores;
studentScores
- 학생 ID별로 여러 과목과 점수를 저장하는 map
- 예: studentScores[1001]["C++"] = 85;
subjectScores
- 과목별로 학생 ID와 점수를 저장하는 map
- 예: subjectScores["C++"].push_back({1001, 85});
sortedSubjectScores
- 특정 과목의 점수를 내림차순(큰 값 → 작은 값)으로 정렬하는 set
- 예: sortedSubjectScores["C++"].insert({85, 1001});
(2) 학생 성적 추가 (addScore)
void addScore(int id, string subject, int score) {
if (score < 0 || score > 100) {
cout << "점수는 0~100 사이여야 합니다!\n";
return;
}
// 기존 점수 갱신
studentScores[id][subject] = score;
// 과목별 점수 리스트에서 학생 ID가 있으면 갱신
bool found = false;
for (auto& p : subjectScores[subject]) {
if (p.first == id) {
p.second = score;
found = true;
break;
}
}
if (!found) {
subjectScores[subject].push_back({id, score});
}
// set에 점수 갱신 (기존 값 삭제 후 새 값 추가)
sortedSubjectScores[subject].erase({score, id});
sortedSubjectScores[subject].insert({score, id});
cout << id << "번 학생 " << subject << " 점수 등록 완료: " << score << "점\n";
}
- 입력된 점수가 0~100 사이인지 검사
- 학생 ID 기준으로 점수 갱신 (studentScores)
- 과목별 성적 데이터 갱신 (subjectScores)
- 기존 점수를 삭제하고 새로운 점수를 추가 (sortedSubjectScores)
(3) 특정 학생의 전체 성적 조회 (viewStudentScores)
void viewStudentScores(int id) {
if (studentScores.find(id) == studentScores.end()) {
cout << "학생 " << id << "의 성적 정보가 없습니다.\n";
return;
}
cout << "학생 " << id << " 성적 목록:\n";
for (auto& it : studentScores[id]) {
cout << "- " << it.first << ": " << it.second << "점\n";
}
}
- 학생 ID가 존재하는지 확인
- 학생 ID가 있으면 해당 학생의 모든 과목과 점수를 출력
- 없으면 "데이터 없음" 메시지 출력
(4) 과목별 평균 점수 출력 (printAverageScores)
void printAverageScores() {
if (subjectScores.empty()) {
cout << "등록된 성적이 없습니다.\n";
return;
}
cout << "과목별 평균 점수:\n";
for (auto& subject : subjectScores) {
double total = 0;
int count = subject.second.size();
for (auto& p : subject.second) {
total += p.second;
}
double avg = total / count;
cout << "- " << subject.first << ": " << avg << "점\n";
}
}
- 등록된 성적이 있는지 확인
- 각 과목별로 모든 점수를 더하고 평균 계산
- 평균 점수를 출력
(5) 특정 과목의 최고 점수 학생 조회 (highestScoreStudent)
void highestScoreStudent(string subject) {
if (sortedSubjectScores.find(subject) == sortedSubjectScores.end() || sortedSubjectScores[subject].empty()) {
cout << subject << " 과목의 성적 데이터가 없습니다.\n";
return;
}
int maxScore = sortedSubjectScores[subject].begin()->first;
cout << subject << " 최고 점수: " << maxScore << "점 (학생 ID: ";
bool first = true;
for (auto& p : sortedSubjectScores[subject]) {
if (p.first == maxScore) {
if (!first) cout << ", ";
cout << p.second;
first = false;
}
else {
break;
}
}
cout << ")\n";
}
- 해당 과목이 존재하는지 확인
- 최고 점수를 찾고, 해당 점수를 받은 학생 ID 출력
- 동점자도 함께 출력
4. 실행 예시
학생 성적 관리 시스템
1. 학생 성적 추가
2. 학생 성적 조회
3. 과목별 평균 점수 출력
4. 과목별 최고 점수 학생 조회
5. 특정 점수 구간 학생 조회
6. 종료
선택: 1
학생 ID, 과목, 점수를 입력하세요 (예: 1001 C++ 85): 1001 C++ 85
1001번 학생 C++ 점수 등록 완료: 85점
선택: 3
과목별 평균 점수:
- C++: 85점
선택: 4
조회할 과목을 입력하세요: C++
C++ 최고 점수: 85점 (학생 ID: 1001)
선택: 6
프로그램을 종료합니다.
'TIL > C++' 카테고리의 다른 글
Unreal Engine에서 Tick 사용법 (0) | 2025.01.08 |
---|---|
챕터 3-2: Unreal Engine 기본 개념 (2) | 2025.01.07 |
챕터 3-1: 디자인 패턴 (0) | 2025.01.06 |
챕터 2-4: 객체지향적 설계 (1) | 2025.01.03 |
챕터 2-3 : STL 기초 (1) | 2025.01.02 |