Code KATA
오늘치의 알고리즘 코드카타를 풀이하고 정리하였다
https://iiblueblue.tistory.com/204
아주아주 오래 걸려서 문제를 풀었다. 푸는 것마다 반례들이 계속 생겨나서 한 정답으로 가지 못하고 천천히 더듬거리며 정답까지 도달했다.
1) index로 이동할 때 하나씩 이동하지 않음
2) 의무 이동 후 z를 넘어가고 그 후 skip에 있는 문자가 포함될 경우
3) 움직일 때마다 계속 skip 문자가 포함될 경우
이 세가지 문제들을 하나씩 해결하며 문제를 해결했다.
Unreal
3-2, 3-3 강의 수강을 마쳤고 실습도 모두 완료하였다.
Quest
- [8번 과제] 게임 루프 및 UI 재설계하기
- [챌린지반 과제] 온라인 학습 관리 시스템 구현 ◀
챌린지반 과제를 하기 시작하였다. 간단해보였지만 시작부터 난제였는데... 나는 과연 어떤 컨테이너를 써야하는 걸까...
구현해야하는 기능들은 아래와 같다.
1) 학생 성적 추가 : 중복인건 업데이트
2) 학생의 전체 성적 조회 : 과목명은 알파벳 순으로 정렬
3) 전체 학생의 평균 점수 출력 : 과목별 평균
4) 과목별 최고 점수 학생 조회 : 동점자는 오름차순 정렬
문제라고 여겼던 부분은 각 기능마다 유리하게 사용할 수 있는 컨테이너가 다르다는 것이다. 1, 2번 기능은 map안에 map을 넣는 방법으로 구현하면 중복 없이 과목도 알파벳순으로 정렬할 수 있다고 생각했다. 하지만 3번 4번의 경우 과목별로 무언가를 해야하는데 한가지 문제가 될만한 상황이 생각났다. 모든 학생이 같은 과목을 듣지 않는다면 이중 map은 순회하기가 너무 어려운 것이다.
일단은 1번과 2번에 맞추어 이중 map을 이용해 학생들의 ID와 과목이름, 성적을 저장하였다.
class OnlineLearningManagementSystem
{
private:
map<int, map<string, int>> students_score_list;
public:
// 학생 성적 추가
void add_score(int student_id, string subject_name, int score)
{
students_score_list[student_id][subject_name] = score;
}
// 학생의 전체 성적 조회
void print_student_score(int student_id)
{
cout << "학생 ID " << student_id << "의 성적:" << endl;
for (auto student : students_score_list[student_id])
{
cout << "- " << student.first << ": " << student.second << "점" << endl;
}
cout << endl;
}
};
예상했던 것처럼 이중 map을 이용한 1, 2번 기능 구현은 순탄했다. sort를 사용할 필요 없이 과목들이 정렬되어 있고 순서대로 출력만 해주면 어렵지 않게 기능을 구현할 수 있었다.
하지만 문제는 3번 기능이었다. 도저히 현재의 이중 map만으로는 구현할 수 없을 것 같아 다른 컨테이너들을 추가로 정의하여 활용해주었다. 과목명이 key이고 모든 과목들의 점수 합을 value로 하는 subjects_sum과 과목명이 key이고 과목을 수강하는 학생 수가 value인 subjects_count이다.
// 전체 학생의 평균 점수 출력
void print_all_student_average()
{
map<string, int> subjects_sum;
map<string, int> subjects_count;
cout << "전체 과목 평균 점수: " << endl;
for (auto students : students_score_list)
{
for (auto score : students_score_list[students.first])
{
subjects_sum[score.first] += score.second;
subjects_count[score.first]++;
}
}
for (auto subject : subjects_sum)
{
cout << "- " << subject.first << ": " << subject.second / subjects_count[subject.first] << "점" << endl;
}
}
두 개의 새로운 컨테이너를 이용하여 for문을 이용해 모든 과목들의 합을 구해주고 더불어 과목을 수강하는 학생수를 계산해주었다. 두 개의 새로운 컨테이너를 모두 채운 후 마지막으로 평균을 리턴해주었다.
어떤 과목이 있는지 중복되지 않게 담을 수 있는 set을 만들까도 생각해보았지만 결국 필요한 것은 아래 두 가지이기 때문에 새로운 컨테이너가 필요할 수 밖에 없었다.
- 과목을 수강하는 학생수
- 과목별 모든 학생의 점수 합
이렇게 이중 map으로 모든 것이 해결되나 싶었던 찰나 4번 기능에서 문제 더 큰 문제를 만나게 된다. 위에 두 가지 값만 필요하면 되던 3번 기능과 다르게 4번 기능은 더 많은 정보가 필요했다.
- 과목별 모든 학생의 점수
- 과목별 그 점수가 누구 점수인지(학생 ID)
이렇게 되면 정말 이중 map만 사용할 수 있는 것이 아닐 것이다. 최소 2개 이상의 컨테이너를 사용하는 것이 과제의 조건이긴 하지만 어떤 컨테이너를 더 사용해야 이 기능들을 잘 구현할 수 있을지 모르겠다. 다른 컨테이너를 더 고민해보고 내일 이어서 해결과정을 적어보도록 하겠다.
'TIL' 카테고리의 다른 글
2025.02.10(월) (0) | 2025.02.10 |
---|---|
2025.02.07(금) (0) | 2025.02.07 |
2025.02.05(수) (0) | 2025.02.05 |
2025.02.04(화) (0) | 2025.02.04 |
2025.02.03(월) (0) | 2025.02.03 |