티스토리 뷰

728x90
반응형

문제

아래와 같이 작동하도록 코드를 작성해라.

몇 기인지 입력해주세요.
3
HTML 과목 점수를 입력해주세요.
60
CSS 과목 점수를 입력해주세요. 
80
Javascript 과목 점수를 입력해주세요. 
65
불합격입니다.
전체 과목 중 최고점은 80점입니다.
전체 과목 중 최저점은 60점입니다.
전체 과목의 평균은 68.33333333333333점입니다.
몇 기인지 입력해주세요.
2
HTML 과목 점수를 입력해주세요.
63
CSS 과목 점수를 입력해주세요. 
82
Javascript 과목 점수를 입력해주세요. 
68
합격입니다.
전체 과목 중 최고점은 82점입니다.
전체 과목 중 최저점은 63점입니다.
전체 과목의 평균은 71.0점입니다.
몇 기인지 입력해주세요.
2
HTML 과목 점수를 입력해주세요.
63
CSS 과목 점수를 입력해주세요. 
82
Javascript 과목 점수를 입력해주세요. 
68
합격입니다.
전체 과목 중 최고점은 82점입니다.
전체 과목 중 최저점은 63점입니다.
전체 과목의 평균은 71.0점입니다.
  • JSCODE 1~3기가 시험을 봤다. 1, 2기는 평균 점수가 60점 이상이어야 합격이다. 3기는 평균 점수가 70점 이상이어야 합격이다. 다만, 100점 과목이 2개 이상일 경우 평균 점수와 상관없이 합격이다.
    • 합격일 경우 합격입니다.라는 문구를 출력해야 한다.
    • 불합격일 경우 불합격입니다.라는 문구를 출력해야 한다.

알아야될 선수 지식

  1. 변수
  2. 입출력 처리
  3. 문자열
  4. 연산자
  5. 형변환
  6. 조건문
  7. 배열
  8. StringBuilder
  9. stream

위 조건은 1 ~ 6번까지만 알아도 충분히 풀수 있다고 생각한다. 하지만 7번부터 할줄알면 코드량 줄어드는데 도움이 될것이다.

 

문제 해결 방법

1. 입력 처리

 입력처리는 Scanner과 BufferReader가 있는데 둘중 BufferReader가 입출력이 더 빨라서 BufferReader로 입력 처리하겠다. BufferReader로 아래 코드 처럼 하면 된다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("몇 기인지 입력해주세요.");
int number = Integer.parseInt(br.readLine());
System.out.println("HTML 과목 점수를 입력해주세요.");
int HTML = Integer.parseInt(br.readLine());;
System.out.println("CSS 과목 점수를 입력해주세요.");
int CSS = Integer.parseInt(br.readLine());
System.out.println("Javascript 과목 점수를 입력해주세요. ");
int Javascript = Integer.parseInt(br.readLine());

여기정 중요한 점은 2가지이다. 입력시 예외처리와 입력값을 정수형을 바꿔주는 것이다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in))

입력처리는 항상 try./catch 예외처리를 해야 한다는 점이다. 하지만 자바에서는 try/catch대신 메소드에 throw로 처리가 가능해서 throw 선언후 IOException처리만 해주면 끝이다.

int number = Integer.parseInt(br.readLine());

 readLine()메소드 사용시 한 줄 문자열로 입력 받기 때문에 정수형으로 선언했으면 정수형으로 바꿔주는 작업도 해야한다. 그래서 Interger.parseInt(String str) 사용하면 입력받는 값이 정수형으로 바꿔 준다.

2. 평균값 계산

int[] gradles = {HTML, CSS, Javascript};
double avg = Arrays.stream(gradles).average().getAsDouble();

 기존 자바책서 공부한것이랑 다를것이다. 책에서는 sum이라는 변수로 더한 다음 N개 만큼 나누면 되는데 그렇게 하면 입력 받는것을 다 더해서 나눠줄때 정수 나누기 정수 = 정수 타입으로로 결과로나와서 실수로 type Casting을 해줘야 하는 번거로움이 있다. 그래서  java8버전부터 추가된 stream을 사용할것이다. 우선 배열로 선언한 다음 Arrays.stream(배열)을 사용하면 다양한 기능을 제공하는데 그중 average()메소드를 사용하면 배열의 평균 값을 한줄로 낼수가 있다.

3. 합격 불합격

 합격 불합격의 조건문은 아래와 같이 낼수가 있다.

if((number > 2 && avg >= 70) || (number <= 2 && avg >= 60) 
	|| (Arrays.stream(gradles).filter(jumsu -> jumsu == 100).count() >= 2 ))

true일때는 합격이고 false이면 불합격이다.

여기서 중요하게 볼것은 Arrays.stream(gradles).filter(jumsu -> jumsu == 100).count() >= 2  이 코드이다.

filter도 stream제공하는 기능중하나이다. 조건에 맞는 것만 처리할수 있도록 해주는 기능이다. 그리고 jumsu -> jumsu == 100 람다 식인데 아래코드를 위 코드 간단하게 함수를 작성하도록 하는것이데 람다식은 자바 기본공부 다하고 보도록 해라

for(int i = 0; i < gradle.length; i++){
	if(gradle[i] == 100){
    	// 구현
    }
}

그 필터링 한 다음 count()사용하면 필터에 조건에 맞는 개수를 출력해준다.

4. 결과 출력

StringBuilder sb = new StringBuilder();
// 합격 불합격 기준
if((number > 2 && avg >= 70) || (number <= 2 && avg >= 60) 
        || (Arrays.stream(gradles).filter(jumsu -> jumsu == 100).count() >= 2 )) {
    sb.append("합격입니다.\n");
}else {
    sb.append("불합격입니다.\n");
}
sb.append("전체 과목 중 최고점은 ")
   .append(Arrays.stream(gradles).max().getAsInt())
   .append("점입니다.\n");
sb.append("전체 과목 중 최저점은 ")
  .append(Arrays.stream(gradles).min().getAsInt())
  .append("점입니다.\n");
sb.append("전체 과목 중 평균은 ")
  .append(avg)
  .append("점입니다.\n");	

System.out.println(sb);

StringBuilder 

결과 출력할때 각 줄마다 System.out.println 사용하면 되는데 StringBuilder를 사용하는 이유는 일반 출력함수보다 전체 결과를 StringBuilder 객체에 담아서 출력하면 더 빠르고 .append 연산을 사용할수 있기 때문이다.

"전체 과목 중 최고점은" +  Arrays.stream(gradles).max().getAsInt() + "점입니다." 이것 보다 .append를 사용하는게 코드작성하기도 편하다.

Arrays.stream(gradles).max().getAsInt() /  Arrays.stream(gradles).min().getAsInt()

정수 배열로  stream 처리중 max/min은 배열안의 최대 최소를 처리를 해준다. 마지막에 getAsInt()로 정수값으로 반환 해주는 것까지 하면된다.

전체 코드

 이번 미션의 전체 코드 이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	
	public static void main(String[] args) throws IOException{
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("몇 기인지 입력해주세요.");
		int number = Integer.parseInt(br.readLine());
		System.out.println("HTML 과목 점수를 입력해주세요.");
		int HTML = Integer.parseInt(br.readLine());;
		System.out.println("CSS 과목 점수를 입력해주세요.");
		int CSS = Integer.parseInt(br.readLine());
		System.out.println("Javascript 과목 점수를 입력해주세요. ");
		int Javascript = Integer.parseInt(br.readLine());
		
		int[] gradles = {HTML, CSS, Javascript};
		double avg = Arrays.stream(gradles).average().getAsDouble();
		
		StringBuilder sb = new StringBuilder();
		// 합격 불합격 기준
		if((number > 2 && avg >= 70) || (number <= 2 && avg >= 60) 
				|| (Arrays.stream(gradles).filter(jumsu -> jumsu == 100).count() >= 2 )) {
			sb.append("합격입니다.\n");
		}else {
			sb.append("불합격입니다.\n");
		}
		sb.append("전체 과목 중 최고점은 ")
		   .append(Arrays.stream(gradles).max().getAsInt())
		   .append("점입니다.\n");
		sb.append("전체 과목 중 최저점은 ")
		  .append(Arrays.stream(gradles).min().getAsInt())
		  .append("점입니다.\n");
		sb.append("전체 과목 중 평균은 ")
		  .append(avg)
		  .append("점입니다.\n");	
		
		System.out.println(sb);
	}
	
}

정리

 이번 미션은 자바 기본인 입출력, 변수, 연산자, 형변환, 조건문 5가지인데 stream, Lambda, StringBuilder 자바 심화 과정에서 다뤄야 될 내용을 여기 미션에 사용했다. 그 이유는 내가 이게 더 편하다고 느껴서 작성했다. 자바를 모르거나 기본만 한 사람은 이 전체 코드를 보는게 힘들수 있다. 솔직히 몰라도 현업에서 일은 할 수 있다고 생각하지만 괜찮은 회사나 잘 하는 사람끼리 일하고 싶으면 3가지는 필수로 알아야 한다고 생각한다.

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함