문제풀이/자바

TIL - 자바의정석 연습문제[ch6 - 3,4 ]

Mo_bi!e 2022. 12. 27. 14:03

[6 - 3, 4]

1. 문제설명

 

2. 나의 해답

package ex6_3;

public class Exercise6_4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Student s = new Student();
		s.name = "홍길동";
		s.ban = 1;
		s.no = 1;
		s.kor = 100;
		s.eng = 60;
		s.math = 76;
		
		System.out.println("이름 : " + s.name);
		System.out.println("총점 : " + s.getTotal());
		System.out.println("평균 : " + s.getAverage());
		
		
	}

}

 

package ex6_3;

public class Student {
	
	String name;
	int ban;
	int no;
	int kor;
	int eng;
	int math;
	
	
	public int getTotal() {
		// TODO Auto-generated method stub
		 
		return this.kor + this.eng + this.math;
	}
	
	
	public float getAverage() {
		// TODO Auto-generated method stub
		
		float av = this.getTotal() / (float)3.0;
		return (float) (Math.round(av * 10) / 10.0);
	}
}

 

<고친코드>

public float getAverage() {
		// TODO Auto-generated method stub
		
		float a = this.getTotal() / 3f;
		a *= 10; // 살릴 만큼 만 뽑아주기 
		a += 0.5f; // 반올림으로 마지막 자리수 반올림여부 결
		
		float b = (int) a / 10f; 
		// 그외 소수점 작업 위해서 정수 형으로 변환 뒤
		// 실수와 연산해서 다시 실수로 바꾸어주기 
		
		return b;
	}
}

 

3. 정답 코드 ( 모범답안 )

 

public float getAverage() {

    return (int)(getTotal() / 3f * 10 + 0.5f) / 10f;
}

 

4. 보충 및 회고 

(1) 보충

 

1) f를 붙여서 강제 형 변환하기에 대한 체화가 필요하다 

 

 

 

(2) 회고 : 문제풀이과정에서 어떻게 접근하려고했는지 (접근방법) + 어려움이 있었는데 해결했다.

 

1) 문제 풀이과정에서 당연하게도 소숫점 두번째 자리에서 반올림하고, 첫번째 자리만 남겨지게끔 하는 방식에서 어려움이 있었다.

우선 나의 구글링으로 도출한 방식은 

Math.round() 메소드를 이용해서 정수형으로 반환하는 것을 이용했다.

 

- 이방식도 있지만 수동으로 남겨지게끔 하는 수까지 인위적으로 10의 자리로 곱하기 하면 가능하다.

- 그리고 반올림은 남겨진 수의 소숫점 첫재자리에 0.5를 더하면 반올림이 가능하다

- 남은 소수들을 없애주기 위해 정수형으로 형변환을 하면 된다,

 

 

2) 3f 와 (float)3.0 은 유사하다고 볼수있다. 

3f가 리터럴을 이용한 형 변환이 흥미로웠다.