
https://www.acmicpc.net/problem/25206
오늘은 백준 25206번 문제를 C#으로 풀었다.
과목별 학점과 등급을 입력받고, 이를 기준으로 전공 평점을 계산하는 문제다.
처음에는 A+, A0, B+ 같은 등급을 어떻게 점수(double)로 매핑할지 고민했는데, Dictionary<string, double>을 사용해서 등급별 점수를 매핑하면 깔끔하게 처리할 수 있었다.
입력은 20줄로 고정되어 있어 for 루프를 돌려서 각 줄을 받아 리스트에 저장했고, 이후 foreach 문으로 리스트를 순회하면서 총합을 계산했다.
등급이 P인 경우는 평점 계산에서 제외해야 해서 if (grade == "P") continue;로 처리했다.
이 과정에서 foreach (var subject in list)의 의미도 다시 복습할 수 있었다. list 안에 저장된 각 string[] 항목이 subject로 들어오며, 각 인덱스를 통해 과목명, 학점, 등급에 접근할 수 있었다.
static void Main(string[] args)
{
Dictionary<string, double> gradeDict = new Dictionary<string, double>()
{
{"A+", 4.5},
{"A0", 4.0},
{"B+", 3.5},
{"B0", 3.0},
{"C+", 2.5},
{"C0", 2.0},
{"D+", 1.5},
{"D0", 1.0},
{"F", 0.0}
};
int inputLength = 20;
List<string[]> inputList = new List<string[]>();
for (int i = 0; i < inputLength; i++)
{
string[] input = Console.ReadLine().Split(); // 과목, 학점, 등급
inputList.Add(input);
}
double totalScore = 0;
double totalCredit = 0;
foreach (var subject in inputList)
{
string subjectName = subject[0];
double credit = double.Parse(subject[1]);
string grade = subject[2];
if (grade == "P") continue;
double score = gradeDict[grade];
totalScore += credit * score;
totalCredit += credit;
}
double average = totalScore / totalCredit;
Console.WriteLine($"{average:F6}");
}
문제에 대한 이해를 더 확실히 하기 위해, 기존 문제를 응용한 문제를 하나 만들어 직접 풀어보았다.
제목은 "너의 수강료는"으로 정하고, 학점당 수강료(10만 원)에 등급에 따라 할인율을 적용하여 총 수강료를 구하는 문제다.
등급별 할인율도 Dictionary로 관리했고, P인 과목은 마찬가지로 계산에서 제외했다.
추가로, D0, F처럼 오히려 수강료가 증가하는 등급도 있어서 할인율을 음수로 처리하는 방식으로 구현했다.
할인 금액을 따로 계산한 후, 원래 수강료에서 빼서 최종 금액을 구했다.
static void Main(string[] args)
{
Dictionary<string, double> payDict = new Dictionary<string, double>()
{
{"A+", 30},
{"A0", 25},
{"B+", 20},
{"B0", 15},
{"C+", 10},
{"C0", 5},
{"D+", 0},
{"D0", -5}, // +5%니까 -5로 처리
{"F", -10} // +10%니까 -10
};
int inputLength = 3;
List<string[]> inputList = new List<string[]>();
for (int i = 0; i < inputLength; i++)
{
string[] input = Console.ReadLine().Split();
inputList.Add(input);
}
double baseFee = 100000;
double totalFee = 0;
foreach (var subject in inputList)
{
string subjectName = subject[0];
double credit = double.Parse(subject[1]);
string grade = subject[2];
if (grade == "P") continue;
double discountRate = payDict[grade];
double originalCost = credit * baseFee;
double discountAmount = originalCost * (discountRate / 100.0);
double finalCost = originalCost - discountAmount;
totalFee += finalCost;
}
Console.WriteLine($"{totalFee:F0}");
}
이렇게 직접 문제를 만들고 풀어보니 Dictionary, 리스트 반복, 형변환 등 다양한 C# 기본 문법을 다시 익힐 수 있어 좋았다.
Dictionary<string, double>를 활용한 등급 매핑 방법
foreach (var item in list) 문법 이해
string 배열로 입력을 저장하고 파싱하는 방법
문제를 응용해서 비슷한 구조로 직접 만들어보면 개념이 훨씬 잘 잡힌다