백준 2884번: 알람 시계 (Java/Kotlin)

문제

https://www.acmicpc.net/problem/2884

방법

  • 입력받은 분(minute)이 45보다 작으면 시(hour)을 -1 하고, 분(minute)은 60-(45-입력받은 분)으로 계산해요.
  • 입력받은 분(minute)이 45보다 작지 않다면 입력받은 분(minute)에서 -45 해요.
  • 또한 시가 0보다 작을 경우 시를 23으로 수정해요.
  • BufferedReader로 입력받아 연산하는 방법이 있어요.
  • Scanner로 입력받아 연산하는 방법이 있어요.

BufferedReader로 입력받아 연산하는 코드

Java

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));
        
	String str = br.readLine();
	StringTokenizer st = new StringTokenizer(str," ");
	int H = Integer.parseInt(st.nextToken());
	int M = Integer.parseInt(st.nextToken());
        
	if(M < 45) {
		H--;
		M = 60 - (45 - M);
             
		if(H < 0) {
  			H = 23;
		}
             
		System.out.println(H + " " + M);
	}
	else {
		System.out.println(H + " " + (M - 45));
	}
    }
}

Kotlin

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

fun main() = with(System.`in`.bufferedReader()){
    
    val str = readLine()
    val token = StringTokenizer(str," ")
    
    var H = token.nextToken().toInt()
    var M = token.nextToken().toInt()
    
    if (M<45){
        H--
        M = 60-(45-M)
        
        if(H < 0){
            H = 23
        }
        println("${H} ${M}")
        
    } else {
        println("${H} ${M-45}")
    } 
}

풀이

  • BufferedReader로 문자열을 받는 방법은 readLine()이 대표적이에요.
  • readLine() 은 한 행을 전부 읽기 때문에 공백 단위로 입력해 준 문자열을 공백 단위로 분리해 주어야해요.
  • 객체를 생성할 때 StringTokenizer("문자열" , 구분자) 클래스를 사용해 분리할 수 있어요.
  • 구분된 변수를 꺼낼 때는 nextToken() 이용하면 차례대로 문자열을 반환해 줘요.
  • 이때 반환시킨 문자열은 반환됨과 동시에 해당 객체에서 사라지게 돼요.

BufferedReader가 뭐예요?

  • 우리가 컴퓨터에서 글을 읽기까지 데이터를 byte 타입으로 전달받아 문자(Char)로 변환하는 과정이 있어요.
  • 그 후에 그 문자들이 다시 배열로 생성돼서(문자열) 우리가 읽는 글(String)이 되는 거예요.
  • Scanner는 문자를 문자열로 반환하기까지 많은 정규식을 검사해야 해서 속도가 느려요.
  • BufferedReader는 버퍼(Buffer)를 통해 입력받은 문자를 쌓아둔 뒤 한 번에 문자열처럼 보내기 때문에 배열을 생성할 필요 없이 바로 String으로 받을 수 있어서 스캐너보다 속도가 빨라요.

정리

BufferedReader는 Scanner 와 다르게 배열을 생성하지 않고 문자열을 그대로 읽어 들이기 때문에 속도가 빨라요.


Scanner 로 입력받아 연산하는 코드

Java

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();
        sc.close();
        
        if(M<45){
            H--;
            M= 60-(45-M);
            
            if(H<0){
                H=23;
            }
            
            System.out.println(H + " " + M);   
        }
        else {
            System.out.println(H + " " + (M-45));
        }
          
    }
}

Kotlin

import java.util.Scanner

fun main() = with(Scanner(System.`in`)){
    var H = nextInt()
    var M = nextInt()
    
    if (M<45){
        H--
        M = 60-(45-M)
        
        if(H < 0){
            H = 23
        }
        println("${H} ${M}")
        
    } else {
        println("${H} ${M-45}")
    }
    
}

참고&출처

[백준] 2884번 : 알람 시계 - JAVA [자바]
[백준] 1000번 : A+B - JAVA [자바]
JAVA [자바] - 입력 뜯어보기 [Scanner, InputStream, BufferedReader]

좋은 웹페이지 즐겨찾기