728x90
https://www.acmicpc.net/problem/5575
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 |