[BaekJoon] 2525번 - 오븐 시계 (java)

1. 문제

👉 문제 바로가기

- 조건

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


- 문제

KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다. 인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다. 그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 분 단위로 자동적으로 계산한다.
또한, KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털 시계가 있다.
훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.

- 입력

첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.

- 출력

첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)

- 예제

  입력      출력  
14   30
20
14   50
17   40
80
19   0
23   48
25
0   13





2. 풀이

요리가 종료되는 시간이 24시를 넘는지 안넘는지 판단하기 위해 조건문 if를 사용한다.

또한 if 대신 삼항 연산자 를 사용해서 조건문을 한 줄로 줄이는 방법도 설명한다.





2가지 입력방법을 사용해서 결과를 출력한다.

  1. Scanner 클래스 - if 조건문 사용
  2. BufferedReader 클래스
      ① StringTokenizer 클래스 - 삼항 연산자 사용
      ② split() 메서드 - 조건문 사용 x


- 1. Scanner 클래스 사용

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int h = sc.nextInt();
        int m = sc.nextInt();
        int t = sc.nextInt();
        
        int finH = h+(m+t)/60; //요리 끝나는 시각
        int finM = (m+t)%60; //요리 끝나는 분
        
        if(finishedHour>=24) System.out.println(finH-24 +" "+ finM); //24시가 지남
        else System.out.println(finH +" "+ finM);
        
    }
}

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

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

/ 은 몫이고, % 은 나머지를 구한다.



[여기서 잠깐!]

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




- 2. BufferedReader 클래스 사용

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



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



여기서 삼항 연산자도 함께 사용해보자.

변수 = (조건문) ? (true 인 경우 연산) : (false 인 경우 연산)

조건이 2개 이상일 경우, 두번째 연산 위치에 또 다른 삼항 연산자를 쓸 수 있다.



① 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 h = Integer.parseInt(st.nextToken()); // 현재 시
        int m = Integer.parseInt(st.nextToken()); // 현재 분
        int t = Integer.parseInt(br.readLine()); // 요리 시간(분)

        int finH = h+(m+t)/60; //요리 끝나는 시각
        int finM = (m+t)%60; //요리 끝나는 분
        
        System.out.println(finH>=24? finH-24+" "+finM : finH+" "+finM);
    }
}

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

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[] arr = br.readLine().split(" "); 

        int h = Integer.parseInt(arr[0]); // 현재 시
        int m = Integer.parseInt(arr[1]); // 현재 분
        int t = Integer.parseInt(br.readLine()); // 요리 시간(분)

        int finH = (h+(m+t)/60)%24; //요리 끝나는 시각
        int finM = ((m+t)%60); //요리 끝나는 분
        
        System.out.println(finH+" "+finM);
    }
}

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





3. Scanner VS BufferedReader 성능 비교

image

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





관련 페이지




Categories:

Updated:

Leave a comment