백준 디지털시계

KIMYEONGJUN·2024년 10월 11일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

세 개의 입력이 주어진다.
첫째 줄부터 세 줄에 걸쳐 시작하는 시각과 끝나는 시각이 “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];
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글