[배열] 학생별, 과목별 성적 구하기 (정답)

포키·2022년 11월 21일
0

국비과정

목록 보기
30/73

'식별자'만 존재하는 생성자

  • 'equals'로 원하는 객체 찾을 때 사용!
  • getter를 따로 사용해서 원하는 객체 찾기 코드를 만드는 건 불편하고 재사용도 어려움
    그러므로 '식별자 객체'를 만들고, 이걸 이용해서 equals 메서드로 찾는다.
    public Subject(String name) {
		setName(name);
	}

존재하지 않는 값은 존재할 수 없는 값으로 두기

ex) 시험 성적, 키, 몸무게 <- 존재하지 않을 경우 '-1' 넣기

	public int getSubjectScore(String name) {
		// 원하는 과목 뽑아서 성적 꺼내오기
		Subject goal = new Subject(name);
		// 성적이 없으면 기본값 -1 (0 ~ 100 존재할 수 있으므로)
		int score = -1;
		for(Subject temp : scores) {
			if(temp.equals(goal)) {
				score = temp.getScore();
			}
		}
		return score;
	}

프로그래밍 문제에서 나오는 배열

  • 학생 * 성적 <- 2차원 배열 문제
  • 현실에서 사용 x
int[][] scoresOfStudent = {
	{100, 90, 80}, 
	{90, 70, 80}, 
	{60, 60, 90} };

💘 실제 현실과 가까운 구조의 배열

  • 2차원 배열이 의미상으로 존재하나, 직접적으로 나오지 않음
    클래스가 각각 1차원 배열 계산을 수행 -> 합쳐지며 사실상 2차원 배열이 됨
학급 - 학생들
학생 - 학생이름, 과목(성적)들
과목 - 과목이름, 성적
  • 또한 클래스로 묶이는 형태는 각각이 객체로서, 모두 식별자를 가지고 있고, 의미있는 단위로 사용 가능

코드 예시

class Subject {
	private String name;
	private int score;

	// 교과목 찾을 때 사용
	// '식별자'만 존재하는 생성자 <- 'equals'로 원하는 객체 찾을 때 사용!
	// getter를 따로 사용해서 원하는 객체 찾기 코드를 만드는 건 불편하고 재사용도 어려움
	// 그러므로 '식별자 객체'를 만들고, 이걸 이용해서 equals 메서드로 찾는다.
	public Subject(String name) {
		setName(name);
	}

	public Subject(String name, int score) {
		setName(name);
		setScore(score);
	}

	public String getName() {
		return name;
	}
	public int getScore() {
		return score;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setScore(int score) {
		this.score = score;
	}

	@Override
	public String toString() {
		return name + " : " + score;
	}

	// 이름이 같으면 같은 교과목명
	@Override
	public boolean equals(Object o) {
		if(o == null || !(o instanceof Subject)) {
			return false;
		}
		Subject temp = (Subject) o;
		return name.equals(temp.getName());
	}
}

class Student {
	private String name;
	private Subject[] scores;

	public Student(String name, Subject... scores) {
		setName(name);
		setScores(scores);
	}

	public String getName() {
		return name;
	}
	public Subject[] getScores() {
		return scores;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setScores(Subject... scores) {
		this.scores = scores;
	}

	// 개인별 총점
	public int getTotal() {
		int total = 0;
		for(Subject temp : scores) {
			total += temp.getScore();
		}
		return total;
	}
	// 개인별 평균
	public int getAvg() {
		return getTotal() / scores.length;
	}
/*
	교과목 점수 찾기
	parameter : 교과목 이름
	return : 점수. (단, 존재하지 않는 교과목인 경우 -1)
	점수는 0 ~ 100, '점수가 없다'는? -1 <- (존재할 수 없는) 음수값 사용!
*/
	public int getSubjectScore(String name) {
		// 원하는 과목 뽑아서 성적 꺼내오기
		Subject goal = new Subject(name);
		// 성적이 없으면 기본값 -1 (0 ~ 100 존재할 수 있으므로)
		int score = -1;
		for(Subject temp : scores) {
			if(temp.equals(goal)) {
				score = temp.getScore();
			}
		}
		return score;
	}

	@Override
	public String toString() {
		String info = "<<" + name + ">>\n";
		for(Subject temp : scores) {
			info += temp.toString() + "\n";
		}
		info += "총점 : " + getTotal() + "\n";
		info += "평균 : " + getAvg();

		return info;
	}
}

class Klass {
	private Student[] list;

	public Klass(Student... list) {
		setList(list);
	}

	public Student[] getList() {
		return list;
	}
	public void setList(Student... list) {
		this.list = list;
	}

	// 교과목 총점
	public int getTotal(String subjectName) {
		int total = 0;
		for(Student temp :  list) {
			int score = temp.getSubjectScore(subjectName);
			// score >= 0 : 과목 성적이 없으면 'score = -1'로 처리했으므로, 그 경우는 제외하고 합계 구함
			if(score >= 0) {
				total += score;
			}
		}
		return total;
	}
	//교과목 평균
	public int getAvg(String subjectName) {
		return getTotal(subjectName) / list.length;
	}

	@Override
	public String toString() {
		String info = "- 학급정보 -\n";
		for(Student temp : list) {
			info += temp.toString() + "\n";
		}
		// 같은 학급이면 시험 과목이 같으므로
		Subject[] scores = list[0].getScores();
		// 학생의 성적들 쫙 뽑아오기
		for(Subject temp : scores) {
			String name = temp.getName();
			info += name + " 총점 : " + getTotal(name) +"\n";
			info += name + " 평균 : " + getAvg(name) + "\n";
		}

		return info;
	}
}

class Answer {
	public static void main(String[] args) {
		Subject s1 = new Subject("국어", 90);
		Subject s2 = new Subject("영어", 70);
		Subject s3 = new Subject("수학", 100);

		Student st1 = new Student("애봉이", s1, s2, s3);
		Student st2 = new Student(
			"김수현", 
			new Subject("국어", 90),
			new Subject("영어", 100),
			new Subject("수학", 100)
		);
		Student st3 = new Student(
			"김유정",
			new Subject("국어", 100),
			new Subject("영어", 100),
			new Subject("수학", 100)
		);

		System.out.println(new Klass(st1, st2, st3));
	}
}

profile
welcome

0개의 댓글