
내가 생각했을때 문제에서 원하는부분
세 개의 입력이 주어진다.
첫째 줄부터 세 줄에 걸쳐 시작하는 시각과 끝나는 시각이 “hh:mm:ss”의 형태로 주어진다.
시작하는 시각과 끝나는 시각 사이에는 빈 칸이 하나 있어서,
한 줄마다 (빈 칸을 포함하여) 총 17글자가 입력으로 주어진다.
시작하는 시각과 끝나는 시각은 항상 다르다.
첫째 줄부터 세 개의 줄에 걸쳐 입력된 구간에 포함되는 시계 정수들 중,
3의 배수인 것의 개수를 출력한다.
입력된 순서대로 각 줄에 한 개씩 차례로 출력하면 된다.
내가 이 문제를 보고 생각해본 부분
입력받은 Start, End 시간을 초단위로 변환한다.
이후 반복문을 통해 Start 시간을 증가시키며 End 시간과 같아지면 빠져나온다.
이 반복문 내부에서 시간을 정수형으로 바꾸어 3의 배수인지 확인하고 맞다면 count를 증가시킨다.
만약 초단위의 시간이 최대치인 23:59:59를 넘어 24가 된다면 0시로 바꿔줘야 하므로 3600(1시간 = 60분 * 60초)
시간을 정수형으로 바꿀때, 10000, 100을 더하는 이유는 딱히 없다.
문자열 연결을 피하기 위해 존재한다.
단순히 시간 + 분 + 초를 더해서 다른 숫자가 나오는걸 방지하고 시간, 분, 초를 그대로 유지하며 같은 수학 연산을 수행시키기 위함이다.
코드로 구현
package baekjoon.baekjoon_23;
import java.io.*;
// 백준 1942번 문제
public class Main803 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int i = 0; i < 3; i++) {
int count = 0;
String line = br.readLine();
String[] times = line.split(" ");
int t1 = timeToSeconds(times[0]);
int t2 = timeToSeconds(times[1]);
while(true) {
if(timeToInt(t1) % 3 == 0) {
count++;
}
if(t1 == t2) {
break;
}
t1++;
t1 %= (3600 * 24);
}
bw.write(String.valueOf(count));
bw.newLine();
}
bw.flush();
bw.close();
}
private static int timeToSeconds(String time) {
String[] parts = time.split(":");
int hour = Integer.parseInt(parts[0]);
int minute = Integer.parseInt(parts[1]);
int seconds = Integer.parseInt(parts[2]);
return hour * 3600 + minute * 60 + seconds;
}
private static int timeToInt(int time) {
int[] list = new int[3];
int cur = time;
for(int i = 0; i < 3; i++) {
list[i] = cur % 60;
cur /= 60;
}
return list[2] * 10000 + list[1] * 100 + list[0];
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.