壁打ちAtCoder

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

AtCoder Beginner Contest 049 by C

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

atcoder.jp

できたもの
A
B
できなかったもの
C
D

問題A

#include <stdio.h>

int main(void){
    char c;
    scanf("%c", &c);

    if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'){
        printf("vowel");
    }
    else{
        printf("consonant");
    }
    
    return 0;
}

1文字だけなのでフォーマット識別子が%cであることに注意。

問題B

#include <stdio.h>

int main(void){
    int h,w,i,j;
    char c[101][101];
    char symbol;
    scanf("%d %d", &h, &w);

    for(i=0;i<h;i++){
        scanf("%s", c[i]);
    }
    
    for(i=0;i<h;i++){
        for(j=0;j<w;j++){
            printf("%c", c[i][j]);
        }
        printf("\n");
        for(j=0;j<w;j++){
            printf("%c", c[i][j]);
        }
        printf("\n");
    }

    return 0;
}

記号を入出力するのに手間取りました。
2次元配列に1文字ずつ入出力することで成功。
入力時は%sだけど出力時は1文字ずつなので%c
改行位置に注意。1行出力ごとなのでjのfor文が終わってから\nを入れます。

問題C

dream/dreamer/erase/eraserのならびのみがあればOKだと逐次チェック法をしようとしたけどdream/er、erase/rの分岐がうまくいかず。
時間内に解けませんでした。

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

int main(void){
    int i;
    char s[100001];
    scanf("%s", s);
    int n = strlen(s);
    int count = 0;

    for(i=0;i<n;i++){
        if(s[i]=='d'&&s[i+1]=='r'&&s[i+2]=='e'&&s[i+3]=='a'&&s[i+4]=='m'){

            if(s[i+5]=='e'&&s[i+6]=='r'&&s[i+7]!='a'){
                i = i+6;
            }
            else{
                i = i+4;
            }
        }
        
        else if(s[i]=='e'&&s[i+1]=='r'&&s[i+2]=='a'&&s[i+3]=='s'&&s[i+4]=='e'){
            if(s[i+5]=='r'){
                i = i+5;
            }
            else{
                i = i+4;
            }
        }
        else{
            count++;
        }
    }

    if(count==0){
        printf("YES");
    }
    else{
        printf("NO");
    }

    return 0;
}

解けなかった原因
・ループ時のカウント(i=の値)がうまくできていなかった(方針自体はよかった)

問題D

まだ