[BaekJoon] 5596번 - 시험 점수 (java)

1. 문제

👉 문제 바로가기

- 조건

시간 제한 메모리 제한
1초 128MB


- 문제

대한고등학교에 재학 중인 민국이와 만세는 4과목(정보, 수학, 과학, 영어)에 대한 시험을 봤다. 민국이와 만세가 본 4과목의 점수를 입력하면, 민국이의 총점 S와 만세의 총점 T 중에서 큰 점수를 출력하는 프로그램을 작성하시오. 단, 서로 동점일 때는 민국이의 총점 S를 출력한다.

- 입력

입력은 2줄로 이루어져 있다.
1번째 줄에는 순서대로 민국이의 정보, 수학, 과학, 영어 점수(정수형)가 있으며, 공백으로 구분되어 있다.
2번째 줄에는 1번째 줄과 마찬가지로 순서대로 만세의 정보, 수학, 과학, 영어 점수(정수형)가 있고, 공백으로 구분되어 있다.

- 출력

문제에서 요구하는 정답을 출력한다.

- 예제

  입력      출력  
100 80 70 60
80 70 80 90
320
100 80 70 60
80 70 60 100
310




2. 풀이

반복문 for를 사용해 4과목의 점수를 입력받아 총 합을 구한다.

for (초기식; 조건식; 증감식) {
    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문 작성;
}




2개의 입력방식을 사용해서 결과를 출력한다.

  1. Scanner 클래스
  2. BufferedReader 클래스
      ① StringTokenizer 클래스
      ② split() 메서드



2-1. Scanner 클래스

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int S = 0, T = 0;
        
        for(int i=0;i<4;i++) S += sc.nextInt();
        for(int i=0;i<4;i++) T += sc.nextInt();
            
        System.out.println(Math.max(S,T));
    }
}

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.

int형 데이터를 입력받기 위해 nextInt() 메서드를 사용한다.

Math.max() 는 전달받은 2개의 인자 중 큰값을 반환 하는 함수이다.



[여기서 잠깐!]

Scanner에 대해 더 자세히 알고싶다면 여기 를 클릭하세요
Math 클래스에 대해 더 자세히 알고싶다면 여기 를 클릭하세요




2-2. BufferedReader 클래스 사용

BufferedReader는 readLine() 메서드를 사용해 한 행을 전부 읽는다.
이를 공백단위로 분리해야 하는데, 두가지 분리 방법으로 문제를 풀어보자.



     ① StringTokenizer 클래스를 사용하여 분리해주는 방법
     ② split() 을 사용하는 방법



① StringTokenizer 클래스를 이용

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

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int S = 0, T = 0;
        
        while(st.hasMoreTokens()){
            S += Integer.parseInt(st.nextToken());
        }
        
        st = new StringTokenizer(br.readLine());
        
        while(st.hasMoreTokens()){
            T += Integer.parseInt(st.nextToken());
        }
      
        System.out.println(Math.max(S,T));
    }
}

readLine()은 한 줄을 통째로 읽어 String으로 반환하기 때문에, StringTokenizer 클래스의 nextToken()를 이용해 공백으로 구분된 입력값들을 순서대로 가져온다.

hasMoreTokens()은 StringTokenizer에 사용할 수 있는 토큰이 더 있는지 확인하는 함수이다.
true를 반환하는 경우는 토큰이 존재하고, false를 반환하는 경우 토큰이 없다는 의미이다.

Integer.parseInt()을 사용해 String형을 int형으로 변환시켜준다.



[여기서 잠깐!]

BufferedReader 클래스에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.





② split() 을 사용

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

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] arrS = br.readLine().split(" ");
        String[] arrT = br.readLine().split(" ");
        
        int S = 0,T = 0;
        
        for(int i=0;i<4;i++){
            S += Integer.parseInt(arrS[i]);
            T += Integer.parseInt(arrT[i]);
        }
        System.out.println(Math.max(S,T));
    }
}

readLine()을 통해 한 줄로 받은 String 데이터를 split(" ") 메서드를 사용해 공백 단위로 나눈 뒤 배열에 저장한다.





3. 성능 비교

image

위에서 부터 순서대로

BufferedReader + StringTokenizer
BufferedReader + split()
Scanner

입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.





관련 페이지

Categories:

Updated:

Leave a comment