오늘은 백준 2884번 문제에 대해 풀어볼 것이다.

알람시계 문제

이 문제는 Summer Time이라고 흔히 알고있는 시간 설정문제다. 실제보다 빠르게 시간을 설정하는 내용인데, 이 문제는 실제 설정시간보다 45분 빠르게 알람이 설정되면 된다.

알람은 N시 M분에 울리기 때문에, 입력 값으로 "N M"이 주어지면, 해당 시간에서 45분을 빼면 된다.

오늘은 입력 값을 받을 때 java.util.Scanner를 사용하지 않고, java.io.BufferedReader와 java.io.InputStreamReader를 사용했다.


시간에서 단순히 45분을 빼어주면 되는데, if문을 사용하여 시간 연산을 해도 된다.

하지만 알고리즘을 공부하는 우리는 시간은 분으로 표현할 수 있다.라는 특징을 이용하여 문제를 해결할 것이다.

1시간 = 60분

1시간은 60분으로 표현할 수 있고, 우리는 주어진 시간에서 45분을 빼야 한다.

즉, 시간을 입력 받았을 때, 분을 다음과 같이 설정할 수 있다.

M = N * 60 + M - 45

위 식을 통해 입력 된 시간에 대하여 전체 분으로 설정하였다.

0시 0분이 입력된다면, -45분이 되고,13시 50분이 입력된다면, 13시 05분이 된다. ( 13*60 + 50 - 45 = 785, 780 = 13*60 )

이제 분을 시간으로 표현 해 줘야 하는데,1시간=60분이고 따라서 다음과 같이 표현된다.

N = M / 60

이제 분을 표현해야 하는데, 분은 위에 써있듯이 입력 된 시간이 0시 45분보다 빠르다면, 음수값이 된다.

시간은 음수로 존재하지 않고, 문제에서는 24시 표현을 사용하고 있기 때문에, 오후 N시를 표현하면 된다. 즉, 12시간에 해당하는 분을 더해주면 오후에 맞는 시간을 찾아갈 것이다. 따라서 다음과 같은 조건을 추가해주면 된다.

if M < 0 Then M += 1440 Else M;

다만, 이 때 분은 시간의 정보도 갖고 있기 때문에 60으로 나눈 후의 나머지만 사용하여야 한다.

M %= 60;

이제 위의 식을 코드로 표현해주면 된다!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Number2884 {
    public static void main(String args[])
    {
        try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)))
        {
            String time = bufferedReader.readLine();
            int hour = Integer.parseInt(time.split(" ")[0]);
            int min = Integer.parseInt(time.split(" ")[1]);

            min += hour * 60 - 45;
            min = (min < 0 ? min + 1440 : min);

            hour = min / 60;
            min %= 60;
            System.out.println(hour + " " + min);
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

결과는 정답!

+ Recent posts