この問題で注意する点を解説します。
まずは暦です。 この問題では、全ての月が 日まで存在する特別な暦を使用しており、私たちが一般に使用するグレゴリオ暦とは異なります。 なので、 月や 月などで場合分けをする必要はありません。
次に入力です。 や は MM/DD
形式で与えられます。MM
と DD
は整数ですが、間に /
が含まれるので、文字列として受け取る必要があります。
最後に出力形式です。この問題の出力形式は条件を満たす を日付が小さい順に出力する必要があります (この操作を「ソート」と呼びます)。 ソートを行う方法には様々な方法がありますが、ここでは以下のような方法を解説します。
この問題でソートする数は、最大で 日から 日の 個です。
なので、要素数が 個の配列 Flag を用意します。
そして、for 文を使用して、全ての の MM
について の MM
と等しいかを判定します。
等しいときの の DD
番目の Flag の要素のフラグを立てます。
すべての について判定が終わったら、for 文で Flag の 番目から 番目までを順にフラグが立っているかを判定し、条件を満たす を出力します。
このようにして、条件を満たす を DD
が小さい順に出力することができます。
xxxxxxxxxx
int main(void) {
char B[5];
int N;
scanf("%s", B);
scanf("%d", &N);
char S[N][5];
for (int i = 0; i < N; i++){
scanf("%s", S[i]);
}
int Flag[31] = {0}; // ソートして出力するために Flag の配列を用意する。 0 -> false, 1-> true
int cnt = 0;
int Bmonth = (B[0] - '0')*10 + (B[1] - '0');
for (int i = 0; i < N; i++){
int Smonth = (S[i][0] - '0')*10 + (S[i][1] - '0');
if (Smonth == Bmonth){ // 生まれた月が等しいかを判定
int day = (S[i][3] - '0')*10 + (S[i][4] - '0') - 1;
Flag[day] = 1; // フラグを立てる
cnt++;
}
}
if (cnt == 0){ // 条件を満たす Si がない場合は 0 を出力する
printf("0");
}
else{
for (int i = 0; i < 31; i++){
if (Flag[i] == 1){
int ansday = i + 1;
printf("%02d/%02d\n", Bmonth, ansday); // 条件を満たす Si の MM と DD を0埋めした2桁にして出力する
}
}
}
return 0;
}
xxxxxxxxxx
using namespace std;
int main() {
string B;
int N;
cin >> B >> N;
vector<string> S(N);
for (int i = 0; i < N; i++) {
cin >> S[i];
}
vector<bool> Flag(31, false); // ソートして出力するための Flag の配列
string Bmonth = B.substr(0, 2); // 生まれた月の最初の2文字を取得
for (int i = 0; i < N; i++) {
string Smonth = S[i].substr(0, 2);
if (Bmonth == Smonth) { // 生まれた月が等しいか判定
int day = stoi(S[i].substr(3, 2)) - 1;
Flag[day] = true; // フラグを立てる
}
}
if (count(Flag.begin(), Flag.end(), true) == 0) { // 条件を満たす S[i] がない場合
cout << 0 << endl;
} else {
for (int i = 0; i < 31; i++) {
if (Flag[i]) {
int ansday = i + 1;
cout << Bmonth << "/" << setw(2) << setfill('0') << ansday << endl; // 0埋めで2桁にして出力
}
}
}
return 0;
}
xxxxxxxxxx
B = input()
N = int(input())
S = []
for i in range(N):
s = input()
S.append(s)
Flag = [False] * 31 # ソートして出力するために Flag の配列を用意する
Bmonth = B[0] + B[1]
for i in range(N):
Smonth = S[i][0] + S[i][1]
if Bmonth == Smonth: # 生まれた月が等しいかを判定
day = int(S[i][3] + S[i][4]) - 1
Flag[day] = True # フラグを立てる
if Flag.count(True) == 0: # 条件を満たす Si がない場合は 0 を出力する
print(0)
else:
for i in range(31):
if Flag[i]:
ansday = i + 1
print(f"{Bmonth}/{ansday:02}") # 条件を満たす Si の MM と DD を0埋めした2桁にして出力する