백준 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 와 다르게 배열을 생성하지 않고 문자열을 그대로 읽어 들이기 때문에 속도가 빨라요.
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}")
}
}
참고&출처
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));
}
}
}
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]
Author And Source
이 문제에 관하여(백준 2884번: 알람 시계 (Java/Kotlin)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@summerdewyes/백준-2884번-알람-시계-JavaKotlin저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)