문제

https://codeforces.com/problemset/problem/1493/B

걸린 시간

01 : 29 : 26

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
#define all(c) c.begin(), c.end()
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

string twoDigit(int input){
    if(input < 10) return "0" + to_string(input);
    else return to_string(input);
}

vector<string> split(string input, char delimiter){
    vector<string> ret;
    istringstream iss(input);
    string token;
    while(getline(iss, token, delimiter))
        ret.push_back(token);
    return ret;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int tc;
    cin >> tc;
    while(tc--){
        int h, m;
        cin >> h >> m;
        string s;
        cin >> s;
        int valid = 0;
        valid |= 1<<0;
        valid |= 1<<1;
        valid |= 1<<2;
        valid |= 1<<5;
        valid |= 1<<8;
        // init
        vector<string> hm = split(s, ':'); 
        int time = atoi(hm[0].c_str())*m+atoi(hm[1].c_str());
        map<char, char> dict;
        dict['0'] = '0';
        dict['1'] = '1';
        dict['2'] = '5';
        dict['5'] = '2';
        dict['8'] = '8';
        while(true){
            int ch = (time/m)%h;
            int cm = time%m;
            string sh = twoDigit(ch);
            string sm = twoDigit(cm);
            int alphabet = 0; 
            for(int c : sh) alphabet |= 1<<(int)c-0x30;
            for(int c : sm) alphabet |= 1<<(int)c-0x30;
            if(valid == (alphabet |= valid)){
                string rh = sh;
                string rm = sm;
                reverse(all(rh));
                rh[0] = dict[rh[0]];
                rh[1] = dict[rh[1]];
                reverse(all(rm));
                rm[0] = dict[rm[0]];
                rm[1] = dict[rm[1]];
                if(atoi(rh.c_str()) < m && atoi(rm.c_str()) < h){
                    cout << sh << ":" << sm << "\n";
                    break;
                }
            }
            time += 1;
        }
    }
    return 0;
}

Round 705 의 A 번 문제 이해에 시간을 다 사용하는 바람에 풀어보지 못한 문제이다. 설명이 매우 길어 어려워보이지만 읽어보면 반 이상은 풀이에 도움이 되지 않는 스토리이다.

Lapituletti 행성의 시간은 지구와 같이 흘러가지만 하루의 시간이 h 시간 m 분 까지 있다. h, m 과 현재 시간을 나타내는 문자열 s 가 주어질 때, 거울에 반사된 디지털 시계의 올바르게 읽히는 시간 중 시작 시간에 제일 근접한 시간을 구하는 것이 목표이다.

구현에 필요한 개념에는 문자열, 문자열 파싱, 비트마스킹 등 이 있다.

'Codeforces' 카테고리의 다른 글

Codeforces #1486B Eastern Exhibition  (0) 2021.03.10
Codeforces #1487B Cat Cycle  (0) 2021.03.09
Codeforces Round #705 (Div. 2) A  (0) 2021.03.07
Codeforces #1491B Minimal Cost  (0) 2021.03.06
Codeforces #1492B Card Deck  (0) 2021.03.05

댓글