壁打ちAtCoder

AtCoderの問題をひたすら解いてくブログです。思考やコードの書き方の私的備忘録として

AtCoder Beginner Contest 058 by C

AtCoder Beginner Contest 058 について
C言語での回答

atcoder.jp

できたもの
A
B

できなかったもの
C
D

問題A

#include <stdio.h>

int main(void){
    int a,b,c;
    scanf("%d %d %d", &a,&b,&c);

    if(b-a==c-b){
        printf("YES");
    }
    else{
        printf("NO");
    }
    
    return 0;
}

複数条件がいるかと思いましたが、問題文中の例から差がマイナスであってもa、bとb、cの差が合えさえすればいいみたいだったので必要なのは b-a==c-b のみです。

問題B

#include <stdio.h>
#include <string.h>

int main(void){
    char o[51],e[51];
    int i;
    scanf("%s", o);
    scanf("%s", e);
    int size_o = strlen(o);
    int size_e = strlen(e);

    if(size_o==size_e){
        for(i=0;i<size_o;i++){
            printf("%c", o[i]);
            printf("%c", e[i]);
        }
    }
    else{
        for(i=0;i<size_e;i++){
            printf("%c", o[i]);
            printf("%c", e[i]);
        }
        printf("%c", o[size_o-1]);
    }
    
    return 0;
}

奇数番目と偶数番目で配列が分かれているので、パスワードの先頭から奇数[0]→偶数[0]→奇数[1]→偶数[1]......と表示していきます。
パスワードの長さが奇数なら偶数[n]→奇数[n+1]、偶数なら奇数[n]→偶数[n]となるので条件に合わせてそれぞれ分け、奇数の場合にはfor文で交互に表示した後最後に奇数の最後を出力するようにしました。

問題C

#include <stdio.h>
#include <string.h>

int main(void){
    int n,i,j;
    char s[51],sa[51];
    int count[26]={0};
    scanf("%d", &n);

    scanf("%s", sa);
    int size = strlen(sa);
    for(i=0;i<size;i++){
        count[(int)sa[i]-97]++;  
    }

    for(i=1;i<n;i++){
        int count_tmp[26] = {0};
        scanf("%s", s);
        size = strlen(s);
        for(j=0;j<size;j++){
            count_tmp[(int)s[j]-97]++;
        }
        for(j=0;j<26;j++){
            if(count_tmp[j]<count[j]){
                count[j] = count_tmp[j];
            }
        }      
    }

    for(i=0;i<26;i++){
        if(count[i]==0){
            continue;
        }
        for(j=0;j<count[i];j++){
            printf("%c", i+97);
        }
    }

    return 0;
}

各配列において、アルファベットの数をカウントし、その数が最小の数ほど出力します。
カウントの仕方として、アルファベットを数値(文字コード)に変換しています。
aの文字コードは97、bの文字コードは98・・・zの文字コードは122なので、97を引くと0,1...25となります。
まずアルファベットの数をカウントする要素26の配列count[26]を0で初期化、
このままでは比較しても全て0になってしまうので、ループの外でS1だけアルファベットの数をカウントして配列に加算しています。
S2からSnまではループ。それぞれのSでアルファベットの数をカウント(count_tmp[26])、coutn[]とそれぞれの要素で数を比較し、小さい方をcountに代入。
出力時には、countが0のアルファベットはスキップ、0以外であればカウントの数ほどループで出力。
97を引いたので出力時には足すことを忘れずに。

解けなかった原因

方針の立て方が良くなかった

問題D

まだ