diff --git a/src/main/java/gpacalc/Application.java b/src/main/java/gpacalc/Application.java index 57e79e1..a1d32ab 100644 --- a/src/main/java/gpacalc/Application.java +++ b/src/main/java/gpacalc/Application.java @@ -1,7 +1,146 @@ package gpacalc; +import java.util.ArrayList; +import static camp.nextstep.edu.missionutils.Console.readLine; +import camp.nextstep.edu.missionutils.Console; + public class Application { + //질문 및 입력받는 함수 + public static String inputValue(String question){ + System.out.println(question); + return Console.readLine(); + } + + //항목에 맞게 스필릿 후 저장 + public static void addSubjects(ArrayList list, String input, String majorType) { + if(input == null || input.isEmpty()){ + throw new IllegalArgumentException("input is empty"); + } + + String[] subjects; + if(input.contains(",")){ + subjects = input.split(","); + } + else{ + subjects = new String[]{input}; + } + + for (String subject : subjects) { + String[] parts = subject.split("-"); + if (parts.length != 3) { + throw new IllegalArgumentException("subject part's number must be 3"); + } + + //className 유효성 검사 + String className = parts[0].trim(); + + // credit 유효성 검사 + String creditString = parts[1].trim(); + int credit; + try { + credit = Integer.parseInt(creditString); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("credit part must be an integer"); + } + if (credit < 1 || credit > 4) { + throw new IllegalArgumentException("credit part must be an integer at 1 to 4"); + } + + //gradeSymbol 유효성 검사 + String gradeSymbol = parts[2].trim(); + if (!Gpa.Grade.isValid(gradeSymbol)) { + throw new IllegalArgumentException("gradeSymbol is invalid: " + gradeSymbol); + } + + list.add(new Gpa(className, credit, gradeSymbol, majorType)); + } + } + + //전체 credit 구하기 + public static int earnedCredits(ArrayList gpaList) { + int allCredit = 0; + for (Gpa gpa : gpaList) { + if (gpa.getGrade().equals("F") || gpa.getGrade().equals("NP")) { + continue; + } + + allCredit += gpa.getCredit(); + } + return allCredit; + } + + //전체 평균 grade 구하기 + public static double averageGrade(ArrayList gpaList) { + double allWeightedScore = 0; + int allCredits = 0; + + for (Gpa gpa : gpaList) { + if (gpa.getGrade().equals("P") || gpa.getGrade().equals("NP")) { + continue; + } + + double gradePoint = gpa.getGradePoint(); + int credit = gpa.getCredit(); + + allWeightedScore += (gradePoint * credit); + allCredits += credit; + } + + if (allCredits == 0) return 0.0; + + return allWeightedScore / allCredits; + } + + //전공 평균 grade 구하기 + public static double majorAverageGrade(ArrayList gpaList) { + double allMajorWeightedScore = 0; + int allMajorCredits = 0; + for (Gpa gpa : gpaList) { + if (gpa.getGrade().equals("P") || gpa.getGrade().equals("NP") || gpa.getMajor().equals("[교양]")) { + continue; + } + + double gradePoint = gpa.getGradePoint(); + int credit = gpa.getCredit(); + + allMajorWeightedScore += (gradePoint * credit); + allMajorCredits += credit; + } + if (allMajorCredits == 0) return 0.0; + return allMajorWeightedScore / allMajorCredits; + } + public static void main(String[] args) { - //TODO: 구현 + ArrayList gpaList = new ArrayList<>(); + // 전공 입력 + String inputMajor = inputValue("전공 과목명과 이수학점, 평점을 입력해주세요(예시: 프로그래밍언어론-3-A+,소프트웨어공학-3-B+): "); + addSubjects(gpaList, inputMajor, "[전공]"); + System.out.println(); + + // 교양 입력 + String inputGeneralEducation = inputValue("교양 과목명과 이수학점, 평점을 입력해주세요(예시: 선형대수학-3-C0,인간관계와자기성장-3-P): "); + addSubjects(gpaList, inputGeneralEducation, "[교양]"); + System.out.println(); + + // 과목목록 출력 + System.out.println("<과목 목록>"); + for (Gpa gpa : gpaList) { + System.out.println(gpa.toString()); + } + System.out.println(); + + // 취득학점 출력 + System.out.println("<취득학점>"); + System.out.println(earnedCredits(gpaList) + "학점"); + System.out.println(); + + // 평점평균 출력 + System.out.println("<평점평균>"); + System.out.println(String.format("%.2f", averageGrade(gpaList)) + " / 4.5"); + System.out.println(); + + // 전공 평점평균 출력 + System.out.println("<전공 평점평균>"); + System.out.println(String.format("%.2f", majorAverageGrade(gpaList)) + " / 4.5"); } } diff --git a/src/main/java/gpacalc/Gpa.java b/src/main/java/gpacalc/Gpa.java new file mode 100644 index 0000000..615b01e --- /dev/null +++ b/src/main/java/gpacalc/Gpa.java @@ -0,0 +1,97 @@ +package gpacalc; + +public class Gpa { + private String className; + private int credit; + private String grade; + private String major; + + //grade enum + public enum Grade { + A_PLUS("A+", 4.5), + A0("A0", 4.0), + B_PLUS("B+", 3.5), + B0("B0", 3.0), + C_PLUS("C+", 2.5), + C0("C0", 2.0), + D_PLUS("D+", 1.5), + D0("D0", 1.0), + F("F", 0.0), + P("P", 0.0), + NP("NP", 0.0); + + private final String symbol; // 성적 예시 (A+) + private final double point; // 점수 예시 (4.5) + + Grade(String symbol, double point) { + this.symbol = symbol; + this.point = point; + } + + public static boolean isValid(String inputSymbol) { + for (Grade g : Grade.values()) { + if (g.symbol.equals(inputSymbol)) { + return true; // 목록에 있으면 유효함 + } + } + return false; // 없으면 무효함 + } + + public static double getPointBySymbol(String inputSymbol) { + for (Grade g : Grade.values()) { + if (g.symbol.equals(inputSymbol)) { + return g.point; + } + } + return 0.0; + } + } + + //constructor + public Gpa(String className, int credit, String grade, String major) { + this.className = className; + this.credit = credit; + this.grade = grade; + this.major = major; + } + + //getter & setter + public double getGradePoint() { + return Grade.getPointBySymbol(grade); + } + + public String getClassName() { + return className; + } + public void setClassName(String className) { + this.className = className; + } + + public int getCredit() { + return credit; + } + public void setCredit(int credit) { + this.credit = credit; + } + + public String getGrade() { + return grade; + } + public void setGrade(String grade) { + this.grade = grade; + } + + public String getMajor() { + return major; + } + public void setMajor(String major) { + this.major = major; + } + + //toString + @Override + public String toString() { + // 형식: [전공] 과목명,학점,성적 + return major + " " + className + "," + credit + "," + grade; + } +}