Algorithm

[Java] 백준 5575번 타임 카드

로춘남 2021. 12. 23. 13:36
728x90

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

 

5575번: 타임 카드

JOI 상사는 직원의 근무시간을 타임 카드로 관리하고있다. 직원들은 전용 장비를 사용하여 타임 카드에 출근 시간을 기록한다. 근무를 마치고 퇴근할 때도 타임 카드에 퇴근 시간을 기록한다.

www.acmicpc.net

import java.io.*;
import java.util.StringTokenizer;

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

        for(int i =0; i<3; i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int h1 = Integer.parseInt(st.nextToken());
            int m1 = Integer.parseInt(st.nextToken());
            int s1 = Integer.parseInt(st.nextToken());
            int h2 = Integer.parseInt(st.nextToken());
            int m2 = Integer.parseInt(st.nextToken());
            int s2 = Integer.parseInt(st.nextToken());

            int t1 = h1*60*60 + m1*60 + s1;
            int t2 = h2*60*60 + m2*60 + s2;

            int t = t2 - t1;

            int h = (t/60)/60 % 24;
            int m = (t/60) % 60;
            int s = t%60;

            System.out.println(h + " " + m + " " + s);

        }



    }
}

출퇴근 시간의 차이를 구하는 문제다. 입력되는값을 모두 초(s)로 계산하여 차이값 t2-t1을 각각 시간(h), 분(m), 초(s)로 변환하고 출력을 해주었다.


※ 다른방법으로 풀어보기

다른방법으로 문제를 풀수 없을까? 고민하던중에 다른 함수를 발견했다.

LocalTime 및 ChronoUnit을 이용해서 문제를 풀 수가 있었다.

import java.io.*;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.StringTokenizer;

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

       for(int i=0; i<3; i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int h1 = Integer.parseInt(st.nextToken());
            int m1 = Integer.parseInt(st.nextToken());
            int s1 = Integer.parseInt(st.nextToken());
            int h2 = Integer.parseInt(st.nextToken());
            int m2 = Integer.parseInt(st.nextToken());
            int s2 = Integer.parseInt(st.nextToken());
           
            LocalTime t1 = LocalTime.of(h1, m1, s1);
            LocalTime t2 = LocalTime.of(h2, m2, s2);
           
            long s = ChronoUnit.SECONDS.between(t1, t2);
            long h = s/3600;
            s -= h*3600;
            long m = s/60;
            s-= m*60;
            
            System.out.printf("%d %d %d %n",h,m,s);

        }
    }
}

int s2 = Integer.parseInt(st.nextToken());까지 입력값을 적용하는것은 동일하고,

LocalTime을 이용하여 시간을 설정해줄 수 있다. LocalTime은 로컬 시간 자바 클래스로 시간 정보만 필요할 때 주로 사용한다. 즉, 시간 정보만 출력된다는 말씀.

 

자바의 Time 패키지에는 날짜와 시간 차이를 구하는 방법이 있다.

두 시간 사이의 간격을 나타낼떄는 Duration을 사용하고

ex)

LocalDateTime startDateTime = LocalDateTime.of(2020, 12, 20, 9, 30, 30);
LocalDateTime endDateTime = LocalDateTime.of(2020, 12, 20, 10, 0, 40);

Duration duration = Duration.between(startDateTime, endDateTime);
log.debug("seconds : {}", duration.getSeconds());
// seconds : 1810

 

두 날짜 사이의 간격을 나타낼때는 Period를 사용해준다.

ex)

LocalDate startDateTime = LocalDate.of(2020, 12, 18);
LocalDate endDateTime = LocalDate.of(2022, 12, 20);

Period period = Period.between(startDateTime, endDateTime);
log.debug("Years : {}", period.getYears());
log.debug("Months : {}", period.getMonths());
log.debug("Days : {}", period.getDays());
// Years : 2 // Months : 0 // Days : 2

 

Duration과 Period 객체를 생성하지 않고 특정 시간 단위로 차이를 구할때는 ChronoUnit를 사용해준다.

ex)

LocalDateTime startDateTime = LocalDateTime.of(2020, 12, 20, 9, 30, 30);
LocalDateTime endDateTime = LocalDateTime.of(2022, 12, 20, 10, 0, 40);

log.debug("Years: {}", ChronoUnit.YEARS.between(startDateTime, endDateTime));
log.debug("Months: {}", ChronoUnit.MONTHS.between(startDateTime, endDateTime));
log.debug("Weeks: {}", ChronoUnit.WEEKS.between(startDateTime, endDateTime));
log.debug("Days: {}", ChronoUnit.DAYS.between(startDateTime, endDateTime));

startDateTime = LocalDateTime.of(2022, 12, 20, 9, 30, 30);
endDateTime = LocalDateTime.of(2022, 12, 20, 10, 0, 40);

log.debug("Hours: {}", ChronoUnit.HOURS.between(startDateTime, endDateTime));
log.debug("Minutes: {}", ChronoUnit.MINUTES.between(startDateTime, endDateTime));
log.debug("Seconds: {}", ChronoUnit.SECONDS.between(startDateTime, endDateTime));
// Years: 2 // Months: 24 // Weeks: 104 // Days: 730
// Hours: 0 // Minutes: 30 // Seconds: 1810

[예제 출처]: https://cornswrold.tistory.com/489 [평범한개발자노트]

 

겉보기에 코드의 길이가 줄어들진 않았지만, 효율면에서는 더 개선된점을 확인 할 수 있었다.

 

728x90

'Algorithm' 카테고리의 다른 글

[Java] 백준 10179번 쿠폰  (0) 2021.12.29
[Java] 백준 10039번 평균 점수  (0) 2021.12.29
[Java] 백준 5543번 상근날드  (0) 2021.12.23
[Java] 백준 14928번 큰 수(BIG)  (2) 2021.12.02
[Java] 백준 2420번  (0) 2021.11.04