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
13 changes: 13 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
순서
1. 전공 과목 입력
2. 교양 과목 입력
3. 과목 목록 출력
4. 취득 학점 출력
5. 평점 평균 출력
6. 전공 평점 평균 출력

구현할 기능
1. 입력받은 정보 split 후 저장
2. grade , P/NP 구분하기
3. 학점 계산하기
4. 평점 평균, 전공 평점 평균 계산하기
35 changes: 34 additions & 1 deletion src/main/java/gpacalc/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,40 @@
package gpacalc;
import static camp.nextstep.edu.missionutils.Console.readLine;

import camp.nextstep.edu.missionutils.Console;

public class Application {
public static void main(String[] args) {
//TODO: 구현
// Scanner scanner = new Scanner(System.in);
Subjects subjects = new Subjects();

System.out.println("전공 과목명과 이수학점, 평점을 입력해주세요(예시: 프로그래밍언어론-3-A+,소프트웨어공학-3-B+):");
String major = Console.readLine();

subjects.input(major, "전공");

System.out.println("교양 과목명과 이수학점, 평점을 입력해주세요(예시: 선형대수학-3-C0,인간관계와자기성장-3-P):");
String GE = Console.readLine();

subjects.input(GE, "교양");
System.out.println();

System.out.println("<과목 목록>");
subjects.print();
System.out.println();

System.out.println("<취득학점>");
int credit = subjects.calculateCredit();
System.out.println(credit + "학점");
System.out.println();

System.out.println("<평점평균>");
String average = subjects.calculateGPA(null);
System.out.println(average + " / 4.5");
System.out.println();

System.out.println("<전공 평점평균>");
String majorAverage = subjects.calculateGPA("전공");
System.out.println(majorAverage + " / 4.5");
}
}
40 changes: 40 additions & 0 deletions src/main/java/gpacalc/Grade.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package gpacalc;

public enum Grade {
A_PLUS(4.5, "A+"),
A_ZERO(4.0, "A0"),
B_PLUS(3.5, "B+"),
B_ZERO(3.0, "B0"),
C_PLUS(2.5, "C+"),
C_ZERO(2.0, "C0"),
D_PLUS(1.5, "D+"),
D_ZERO(1.0, "D0"),
P(0.0, "P"),
NP(0.0, "NP"),
F(0.0, "F");

private final double score;
private final String grade;

Grade(double score, String grade) {
this.score = score;
this.grade = grade;
}

public double getScore() {
return score;
}

public String getGrade() {
return grade;
}

public static Grade of(String grade) {
for (Grade value : values()) {
if (value.grade.equals(grade)) {
return value;
}
}
throw new IllegalArgumentException("해당하는 등급이 없습니다.");
}
}
98 changes: 98 additions & 0 deletions src/main/java/gpacalc/Subjects.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package gpacalc;

import java.util.Stack;

import static org.junit.platform.commons.util.StringUtils.isBlank;

public class Subjects {
Stack<String> stack = new Stack<>();

public void input(String subject, String type){
String subjects[] = subject.split(",");
for(int i = 0; i < subjects.length; i++){
subjects[i] = subjects[i].replace("-", ",");
String subjectName = subjects[i].split(",")[0];
System.out.println("subjectName: " + subjectName);
if(isBlank(subjectName) && isValid(subjectName))
stack.push("[" + type + "] " + subjects[i]);
}
}
public boolean isBlank(String subjectName){
if(subjectName.isBlank()){
throw new IllegalArgumentException("과목명은 공백이 될 수 없습니다.");
}
return true;
}
public boolean isValid(String subjectName){
if(subjectName.length() > 10){
throw new IllegalArgumentException("과목명은 10글자 이내로 입력되어야 합니다.");
}
return true;
}
public void print(){
for(int i = 0; i < stack.size(); i++){
System.out.println(stack.get(i));
}
}
public int calculateCredit(){
int result = 0;
for(int i = 0; i < stack.size(); i++){
String info[] = stack.get(i).split(",");
int credit = Integer.parseInt(info[1]);
String grade = info[2];
isValidCredit(credit);
if(grade.equals("F") == false && grade.equals("NP") == false){
result += credit;
}
}
return result;
}

public void isValidCredit(int credit){
if(credit < 1 || credit > 4){
throw new IllegalArgumentException("학점은 1~4 사이의 숫자만 가능합니다.");
}
}

public String calculateGPA(String type) {
double result = 0;
int credit = 0;
for(int i = 0; i < stack.size(); i++){
String info[] = stack.get(i).split(",");
int subjectCredit = Integer.parseInt(info[1]);
String subjectGrade = info[2];

if(type == null || info[0].contains(type)){
if(!subjectGrade.equals("P") && !subjectGrade.equals("NP")) {
if (subjectGrade.equals("A+")) {
result += 4.5 * subjectCredit;
} else if (subjectGrade.equals("A0")) {
result += 4.0 * subjectCredit;
} else if (subjectGrade.equals("B+")) {
result += 3.5 * subjectCredit;
} else if (subjectGrade.equals("B0")) {
result += 3.0 * subjectCredit;
} else if (subjectGrade.equals("C+")) {
result += 2.5 * subjectCredit;
} else if (subjectGrade.equals("C0")) {
result += 2.0 * subjectCredit;
} else if (subjectGrade.equals("D+")) {
result += 1.5 * subjectCredit;
} else if (subjectGrade.equals("D0")) {
result += 1.0 * subjectCredit;
}
else if(subjectGrade.equals("F")){
result += 0.0 * subjectCredit;
}
else{
throw new IllegalArgumentException("성적은 A+, A0, B+, B0, C+, C0, D+, D0, F, P, NP만 가능합니다.");
}
credit += subjectCredit;
}
}
}
System.out.println("result: " + result + ", credit: " + credit);
result = result / credit;
return String.format("%.2f", result);
}
}
60 changes: 60 additions & 0 deletions src/test/java/gpacalc/SubjectsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package gpacalc;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.*;

class SubjectsTest {
Subjects subjects;

@BeforeEach
void setUp() {
subjects = new Subjects();
}

@AfterEach
void tearDown() {
subjects = null;
}

@Test
void isBlankTest() {
assertThatThrownBy(() -> subjects.isBlank(""))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("과목명은 공백이 될 수 없습니다.");
}
@Test
void 학점이_잘못된_경우() {
//when
subjects.input("프로그래밍언어-5-A0", "전공");

//then
assertThatThrownBy(() -> subjects.calculateCredit())
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("학점은 1~4 사이의 숫자만 가능합니다.");
}

@Test
void 성적이_잘못된_경우() {
//when
subjects.input("프로그래밍언어-3-S", "전공");

//then
assertThatThrownBy(() -> subjects.calculateGPA(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("성적은 A+, A0, B+, B0, C+, C0, D+, D0, F, P, NP만 가능합니다.");
}
@Test
void calculateGPATest() {
//given
subjects.input("데이타구조-3-A0,자바프로그래밍언어-3-B+,컴퓨터구조-3-C0,컴퓨터네트워크-3-D+,미술의이해-3-P,교양특론3-1-NP,기독교의이해-2-F", null);

//when
String result = subjects.calculateGPA(null);
//then
assertEquals("2.36", result);
}
}