AtCoder振り返りその4(AtCoder Beginner Contest 307)

まえがき

競技プログラミング振り返り4回目となります。
今回解けたのはA,B問のみのため以下はその内容の振り返りとなります。

A問(A - Weekly Records)

問題はこちら→A - Weekly Records

7日ごとの合計を出せばいいだけですね

A問提出コード

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

int main(void)
{
	int week;
	int sum[10] = { 0 };
	scanf("%d", &week);
	for (int i = 0; i < week; i++)
	{
		for (int j = 0; j < 7; j++)
		{
			int a;
			scanf("%d", &a);
			sum[i] += a;
		}
	}
	for (int i = 0; i < week; i++)
	{
		printf("%d ", sum[i]);
	}
	return 0;
}

二重for文で入力をとっているだけですね。

B問(B - racecar)

問題はこちら→B - racecar

N個の文字列が与えられるので、与えられた文字列の内異なる二つの文字をつなげて回文が成立する組み合わせがあるか判定します。

B問提出コード

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



int main(void)
{
	int n;
	char s[101][51];
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%s", s[i]);
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			{
				char palindrome[101] = { 0 };
				strcpy(palindrome, s[i]);
				strcat(palindrome, s[j]);
				int palong = strlen(palindrome);
				for (int k = 0; k < (n + 1) / 2; k++)
				{
					if (palindrome[k] != palindrome[palong - 1 - k])
					{
						break;
					}
					if (k + 1 == (n + 1) / 2)
					{
						printf("Yes\n");
						return 0;
					}

				}
			}
			{
				char palindrome[101] = { 0 };
				strcpy(palindrome, s[j]);
				strcat(palindrome, s[i]);
				int palong = strlen(palindrome);
				for (int k = 0; k < (n + 1) / 2; k++)
				{
					if (palindrome[k] != palindrome[palong - 1 - k])
					{
						break;
					}
					if (k + 1 == (n + 1) / 2)
					{
						printf("Yes\n");
						return 0;
					}
				}
			}
		}
	}
	printf("No\n");
	return 0;
}

二重for文を使い異なる文字列のみstrcpyとstrcatを使い判定を行うための文字列を作成し、for文で一文字ずつ見ていきます。

感想

今回解けたのはA,Bのみですが今回のB問はなかなか解きがいがありました。

/* -----codeの行番号----- */