Official

A - Spoiler Editorial by kyopro_friends


初心者の方へ
  • プログラミングの学習を始めたばかりで何から手をつけるべきかわからない方は、まずは practice contest の問題A「Welcome to AtCoder」をお試しください。言語ごとに解答例が掲載されています。
  • また、プログラミングコンテストの問題に慣れていない方は、 AtCoder Beginners Selection の問題をいくつか試すことをおすすめします。
  • C++入門 AtCoder Programming Guide for beginners (APG4b) は、競技プログラミングのための C++ 入門用コンテンツです。

この問題にはいくつも解法が考えられます。

解法1

\(S\)|\(3\) つに分け、\(1\) 番目と \(3\) 番目の文字列を連結したものが答えです。例えば Python で split メソッドにより実装できます。

実装例(Python)

S = input()
a, b, c = S.split('|')
print(a+c)

解法2

\(S\)\(2\) 度含まれる | の位置をそれぞれ \(x,y\) 文字目としたとき、「\(x\) 文字目より前」と「\(y\) 文字目より後」を連結したものが求める文字列です。例えば C++ では find メソッドと substr メソッドにより実装できます。

実装例(C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
	string s;
	cin >> s;
	int x = s.find("|");  // 先頭から見て最初に '|' が現れる位置
	int y = s.rfind("|");  // 末尾から見て最初に '|' が現れる位置
	cout << s.substr(0,x) + s.substr(y+1) << endl;
}

解法3

「空文字列 \(T\) を用意し、\(S\) の先頭の文字から順に、\(1\) 度目の | から \(2\) 度目の | の間の文字を無視、それ以外の文字は \(T\) の末尾に加える」とすることで求める文字列を構築できます。例えば C++ では次のように実装できます。

実装例(C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
	string s;
	cin >> s;
	string t;
	int count = 0;
	for(char c: s){
		if(c == '|'){
			count++;
		}else{
			if(count != 1) t+=c;
		}
	}
	cout << t << endl;
}

解法4

正規表現により置換して求める文字列を得ます。| はエスケープが必要な文字であることに注意してください。例えば Python では re.sub メソッドにより実装できます。

実装例(Python)

import re
S = input()
print(re.sub("\|.*\|", "", S))

posted:
last update: