본문 바로가기
7장 기타/백준 BOJ

[백준/BOJ] 2884번 알람 시계 (C++)

2021. 5. 3.
 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net

문제의 소재

시, 분이 주어졌을 때 45분 전의 시간을 출력하는 문제이다.

해답

시간은 24시간, 분은 60분을 기준으로 단위가 바뀐다. 시간이 45분 이상이면 분에서 45를 빼면 되고, 45분 미만일 경우 시간에서 1을 빼고 분에 15를 더하면 된다. 45분 미만인데 시간이 0시인 경우 -1시가 되므로 23시로 바꾸어주어야 한다. 따라서 if-else문을 이용하여 3가지 조건을 체크하여 풀었다.

// BOJ_2884.cpp
#include <iostream>
using namespace std;

int main()
{
    int h, m;
    
    cin>>h>>m;
    if (h == 0 && m < 45) h = 23, m += 15;
    else if (m < 45) h -= 1, m += 15;
    else m -= 45;
    cout<<h<<" "<<m<<endl;
    
    return 0;
}

수학적으로 분에 45를 빼고 60으로 나눈 나머지 (m-45)%60이 현재 분이지만, C++의 나머지 계산은 부호를 고려하지 않기 때문에 m-45가 양수일 경우 수학적인 계산과 같으나, m-45가 음수이면 계산이 제대로 되지 않는다. 따라서 60을 더한 후 60으로 나눈 나머지로 계산하여 원하는 분을 얻었다.

 

마찬가지로 분에 45를 빼고 60으로 나눈 몫 (m-45)/60은 수학적으로 m-45가 양수 일 때는 0이고, 음수일 때는 -1이다. 그러나 C++의 나머지 계산이 부호를 고려하지 않으므로 두 값 모두 0이 나온다. 따라서 분에 60을 더한후 60으로 나누면 45분 이상일 때는 몫이 1이고, 45분 미만일 때는 몫이 0이다. 따라서 시간에 (m+15)/60-1 을 더하면 현재 시간을 구할 수 있다. 시간 계산도 마찬가지로 나머지 계산시 부호를 고려하지 않기 때문에 24를 더하고 24로 나눈 나머지로 계산할 수 있다.

 

따라서 수학적으로 표현하면 if-else문을 사용하지 않고 1줄로 시간 계산을 할 수 있다.

// BOJ_2884.cpp
#include <iostream>
using namespace std;

int main()
{
    int h, m;
    
    cin>>h>>m;
    cout<<(h+(m+15)/60+23)%24<<" "<<(m+15)%60<<endl;

    return 0;
}

 

반응형

댓글