개발하고/코딩테스트

[백준] 2884번 알람 시계

씩씩환 2023. 7. 15. 11:48

https://www.acmicpc.net/problem/2884

 

2884번: 알람 시계

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

www.acmicpc.net

1.문제 분석

 처음에 정답 비율이 낮아 보이길래 어려운 문제인줄 알았는데 그냥 실수를 하신것 같다...

단순히 시간을 빼는 문제로 예를들어 10시 10분에서 45분을 빼서 9시 25분을 출력하면 되는 문제이다. 문제가 단순해 코드를 바로 보는 것이 더 좋을 것 같다.

 

시간복잡도 계산

 단순하고 반복문도 없으므로 그냥 시간복잡도 = O(1)

 

 

 

2. 코드

#include<iostream>
using namespace std;

class Time {
public:
    int mHour;
    int mMinute;

public:
    Time() : mHour(0), mMinute(0) {}
    Time(int hour, int minute) : mHour(hour), mMinute(minute) {}
    Time(const Time &time) : mHour(time.mHour), mMinute(time.mMinute) {}

    void minusHour(int hour) {
        hour %= 24;

        if (mHour >= hour) {
            mHour -= hour;
        }
        else {
            mHour = mHour + 24 - hour;
        }
    }

    void minusMinute(int minute) {
        minusHour(minute / 60);
        minute %= 60;

        if (mMinute >= minute) {
            mMinute -= minute;
        }
        else {
            mMinute = mMinute + 60 - minute;
            minusHour(1);
        }
    }

    Time operator-(const Time &ref) {
        Time resultTime(*this);

        resultTime.minusMinute(ref.mMinute);
        resultTime.minusHour(ref.mHour);

        return resultTime;
    }
};

int main() {
    Time inputTime;
    Time gapTime(0, 45);

    cin >> inputTime.mHour >> inputTime.mMinute;
    
    Time outputTime = inputTime - gapTime;

    cout << outputTime.mHour << " " << outputTime.mMinute << endl;
}