백엔드 과정/Java

Java 문제풀이2-1 . if문 (과목별 합격 / 불합격 사유 출력하기)

mim 2021. 12. 23. 21:04
반응형

문제

/* 국어, 영어, 수학 점수를 입력받아 
 * 평균 점수가 60점 이상이면서 각 과목이 40점 이상인 조건이 만족하면 "합격입니다!" 를 출력하세요,
 * 단, 합격이 아닌 경우 불합격 사유가 무엇인지를 모두 출력해주어야 합니다.
 * 평균점수 미달인 경우 "평균점수 미달로 불합격입니다." 라고 출력하고,
 * 과목당 과락 점수가 있는 경우 "xx 과목의 점수 미달로 불합격 입니다." 출력하세요
 * 
 * -- 입력 예시 --
 * 국어 점수를 입력하세요 : 60
 * 영어 점수를 입력하세요 : 30
 * 수학 점수를 입력하세요 : 20
 * 
 * -- 출력 예시 --
 * 평균 점수 미달로 불합격입니다.
 * 영어 점수 미달로 불합격입니다.
 * 수학 점수 미달로 불합격입니다.
 * */

 

처음 작성한 코드)

		Scanner sc = new Scanner(System.in);
		
		System.out.print("국어 점수를 입력하세요 : ");
		int kor =sc.nextInt();
		System.out.print("영어 점수를 입력하세요 : ");
		int eng =sc.nextInt();
		System.out.print("수학 점수를 입력하세요 : ");
		int mat =sc.nextInt();

		/* 평균을 구하는 변수 선언 */
		int avg = (kor + eng +mat) /3 ;

팀원들과 여기까지는 동일했고,  뒤에 내가 짠 코드는 엉망진창. 

문제는 평균 점수가 60점 이상 , 국영수 점수가 각각 40점 미만이면 과락 여기까지는 쉬운데,

 

평균 60점 이상일때 과목미달이 없는경우 -> 합격입니다.

평균 60점 이상이지만 국어과목이 미달인 경우 -> 국어 점수 미달입니다. 

평균 60점 이상이지만 영어과목이 미달인 경우 -> 영어 점수 미달입니다.

과목별로 미달과목 모두 출력해야하고,

 

평균 60점 이하이고 과목미달은 없는 경우 -> 평균 미달입니다.

평균 60점 이하이고 국어과목이 미달인 경우 -> 국어 점수 미달입니다.

평균 60점 이하이고 영어과목이 미달인 경우 -> 영어 점수 미달입니다.

역시 미달과목도 같이 나와야함.

 

예를들어 국어 과목이 35점 영어과목 90점 수학과목 95점을 입력하면

국어과목이 미달입니다. 라고만 나와야 하는데 (평균은 60점 넘으니까 평균 미달은 안나와야 함)

 

평균 점수가 미달입니다.

국어과목이 미달입니다.

 

이렇게 나오는가 하면, 

 

합격입니다. 

수학점수가 미달입니다. 

 

이렇게 나오는 등 아주 미쳐버리는 줄 알았다.

결과)

		/* 40점 미만 과락한 과목 판별 과락이면 F, 40점 이상이면 P */
        String fass = "";
				
		if(kor<40){
			fass = "F";
		}else if(kor<40 && eng<40){
			fass = "F";
		}else if(kor<40 && eng<40 && mat<40) {
			fass = "F";			
		}else if(eng<40 ){
			fass = "F";
		}else if(eng<40 && kor<40) {
			fass = "F";			
		}else if(eng<40 && kor<40 && mat<40){
			fass = "F";
		}else if(mat<40){
			fass = "F";
		}else if(mat<40 && kor<40) {
			fass = "F";			
		}else if(mat<40 && kor<40 && eng <40){
			fass = "F";
		}else {
			fass= "P";
			}
		
		// 합격, 평균미달 확인하여 출력 
		if (avg>60 && fass == "P") {
			System.out.println("합격입니다.");
		} else if(avg<60 && fass =="P"){
			System.out.println("평균미달로 불합격입니다.");
		} else if(avg<60 && fass =="F"){
			System.out.println("평균미달로 불합격입니다.");
		} else if (avg>60 && fass == "F") {}
		
		// 과락인 과목 확인하여 출력
		if (kor < 40) {
			System.out.println("국어점수 미달로 불합격입니다.");
		}
		if (eng < 40){
			System.out.println("영어점수 미달로 불합격입니다.");
		}
		if (mat < 40){
			System.out.println("수학점수 미달로 불합격입니다.");
		}

그렇게 작성된 코드.. 나름 과목점수 미달 출력문은 한번씩만 나와서 깔끔하다고 생각하기도 했다.........()

 

중첩 if문을 else와 else if 등 갈래 설정 자체를 다시 논리적으로 정리해야 풀 수 있는 문제였다.

선택지 자체를 논리적으로 정리해야하는데 나는 경우의 수 모두를 코드로 작성하려고 했고,

 

그와중에 코드가 길어지니까 if문 활용은 개나주고

 

급기야 코드를 줄여야 겠다는 생각하에 조건에 대한 String 변수를 선언해서 

 

/* 40점 미만 과락한 과목 판별 ( 40점 미만이면 "F" , 40점 이상이면 "P" ) */

 

로 만들기 시작함......... () 

 

엉망진창 이지만 결론적으로 출력이 돌아가기는 돌아가는데.

코드를 한눈에 알아보기 힘들다는 걸 알고는 있었지만 여러 실패에 우선 돌아가게 하자 가 급했다 .. 

 

 

더 간단하게 조건문으로 만들 수 있다는 걸 팀스터디의 팀원분 코드를 보고 알았다.

수업 중 배운 내용으로 최대한 잘 원론적으로 접근하자는 걸 깨달은 이번 문제.

잘 안풀릴때는 기초적인 수업내용 코드를 보고 다시한번 이해하고 문제를 다뤄야 겠다고 느낌.

 

 

출력)

국어 점수를 입력하세요 : 60
영어 점수를 입력하세요 : 30
수학 점수를 입력하세요 : 20
평균 점수 미달로 불합격입니다.
영어 점수 미달로 불합격입니다.
수학 점수 미달로 불합격입니다.

 

그리고 문제를 주실때 출력에 대한 예시가 들어 있다보니

예시에 나온 점수만 입력하면 돌아가는데, 다른 값을 입력하면 잘 출력되지 않기도 했다.

 

예를들어 20점 90점 90점을 입력했을 때 평균 점수는 미달이 아닌데 미달로 나온다는 지 

실제로 잘 적용되는지 계속 숫자값을 다르게 입력해보면서 오류가 나오지는 알아보는 과정을 거쳐서 

계속 결과값이 맞게 출력하려고 했고, 완성을 해냈다는 게  나름 만족스러운 부분이었다. 

 

물론 더 나은 코드로 앞으로 조건식을 잘 만들어 봐야겠다 생각함.

 

 

반응형