본문 바로가기
Algorithm/Baekjoon

[백준] 2884번 : 알람 시계 - Java

by unknownomad 2022. 2. 16.

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

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net



주의점

  • 시간 : 24시간으로 표현
  • 입력 : 공백 한 칸을 기준으로 구분 후 입력
  • 출력 : 불필요한 0 사용 X

알고리즘

  1. 분침 : 숫자 45 미만이라면 - if(min < 45)
    1. 분침 : 60 - (45 - 입력값) 
    2. 시침 : 0보다 작다면 - if(hour < 0)
  2. 분침 : 45 이상이라면 - else
    1. 분침 : 입력값 - 45

입력 방식

1. Scanner

2. BufferedReader

2.1. 문자열 받는 대표적인 방법

  • read():  한 문자만 읽어오기
  • readLine(): 한 행 읽어오기(사용 권장)
  • readLine()은 한 행을 전부 읽기에 공백 단위로 입력해준 문자열을 다시 공백 단위로 분리해줘야 함

 

2.2. 문자열 분리 방법

2.2.1. StringTokenizer 클래스

  • split()보다 성능 좋음(단순 규칙으로 문자열 분리하거나 데이터가 더 많아질 때 추천)

2.2.2. split()

 

2.3. 형변환 주의점

  • StringTokenizer 클래스와 split() 모두 문자열을 반환하기에 자료형 타입 확인 후 형변환 유의하기
  • double형으로 풀면 나머지가 정수로 나와도 소수점까지 같이 출력되어 오답으로 처리됨

출력 방식

  • System.out.println()
  • StringBuilder() + System.out.println() : 출력값이 많아질수록 성능 better

풀이

1. Scanner + if 문

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
    
        //입력
        Scanner in = new Scanner(System.in);
        int H = in.nextInt(); //시
        int M = in.nextInt(); //분
        in.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));
        }
    }
}

2. BufferedReader + if 문

2.1. BufferedReader + StringTokenizer 클래스 + if 문

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));
        //long ver.
        String str = br.readLine();
        StringTokenizer st = new StringTokenizer(str," "); //문자열 분리
        //short ver.
        StringTokenizer st = new StringTokenizer(br.readLine();," ");
        //문자열 ➡ 정수 형변환
        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));
        }
    }
}

 

2.2. BufferedReader + split() + if 문

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[] str = br.readLine().split(" ");
        int H = Integer.parseInt(str[0]);
        int M = Integer.parseInt(str[1]);
		
        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));
        }
    }
}

 

2.3. BufferedReader + StringTokenizer 클래스 / split() + StringBuilder + if 문

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());
		
        StringBuilder sb = new StringBuilder();
 
        if(M < 45) {
            if(H == 0) {
                H = 23;
            } else {
                H--;
            }
            sb.append(H).append(' ');
            sb.append(M = 60 - (45 - M));
        } else {
            sb.append(H).append(' ').append(M - 45);
        }
        System.out.println(sb);
    }
}

성능

  • BufferedReader > Scanner

 


출처 : https://st-lab.tistory.com/24

댓글