はまやんはまやんはまやん

hamayanhamayan's blog

E869120 and TimeZone [yukicoder No.652]

https://yukicoder.me/problems/no/652

解法

https://yukicoder.me/submissions/238458

前の問題でやったのと同様に分にまとめて考える。
Sは "UTC+X", "UTC-X", "UTC+X.X", "UTC-X.X"のいずれかなので、これを場合分けする。
場合分けには+と-のどちらか、小数点はあるかどうかで判定すればいい。
各場合分け先でXの値を取る必要があるが、これにはc++ならsscanfを使うといい。
これを分に直して、今の時間をずらす。
最初のa時b分はUTC+9なので、9*60分だけ戻して標準時間に戻しておこう。
出力前に[0,24*60)の範囲外の場合は上手く範囲内に戻して、時間と分に直して出力する。

int a, b;
string S;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> a >> b >> S;

    int t = a * 60 + b - 9 * 60;

    int n = S.length();
    if (S[3] == '+') {
        if (S[n - 2] == '.') {
            // UTC+X.X
            int x, y;
            sscanf(S.c_str(), "UTC+%d.%d", &x, &y);
            t += x * 60 + y * 6;
        } else {
            // UTC+X
            int x;
            sscanf(S.c_str(), "UTC+%d", &x);
            t += x * 60;
        }
    } else {
        if (S[n - 2] == '.') {
            // UTC-X.X
            int x, y;
            sscanf(S.c_str(), "UTC-%d.%d", &x, &y);
            t -= x * 60 + y * 6;
        }
        else {
            // UTC-X
            int x;
            sscanf(S.c_str(), "UTC-%d", &x);
            t -= x * 60;
        }
    }

    if (t < 0) t += 2 * 24 * 60;
    t %= 24 * 60;
   
    int h = t / 60;
    int m = t % 60;

    printf("%02d:%02d\n", h, m);
}