Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 140 additions & 1 deletion src/main/java/gpacalc/Application.java
Original file line number Diff line number Diff line change
@@ -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<Gpa> 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<Gpa> 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<Gpa> 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<Gpa> 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<Gpa> 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");
}
}
97 changes: 97 additions & 0 deletions src/main/java/gpacalc/Gpa.java
Original file line number Diff line number Diff line change
@@ -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;
}
}