この記事の目的
競技プログラミングでは少数派のJSerのために正解した問題の解答例を記載しておきます。
より良い解法があればご指摘いただきたいです!
今回のコンテストの内容はこちらから!
https://atcoder.jp/contests/abc279/
A - wwwvvvvvv
問題文
v と w のみからなる文字列 S が与えられます。
S の中に、下に尖っている部分が何箇所あるかを出力してください。
入力
入力は以下の形式で標準入力から与えられる。
S
解答例
var lines = [];
var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', function (line) {
lines.push(line);
});
reader.on('close', function () {
const S = lines[0];
const strings = S.split('');
let num = 0;
strings.forEach(str => {
if(str == "v"){
num = num +1;
}
if(str == "w"){
num = num +2;
}
})
console.log(num);
});
解説
単純なif文の条件分岐でできます
B - LOOKUP
問題文
英小文字からなる文字列 S,T が与えられるので、 T が S の(連続する)部分文字列かどうか判定してください。
なお、文字列 X に以下の操作を 0 回以上施して文字列 Y が得られる時、またその時に限り Y は X の(連続する)部分文字列であると言います。
以下の 2 つの操作から 1 つを選択して、その操作を行う。
X の先頭の 1 文字を削除する。
X の末尾の 1 文字を削除する。
例えば tag は voltage の(連続する)部分文字列ですが、 ace は atcoder の(連続する)部分文字列ではありません。
入力
入力は以下の形式で標準入力から与えられる。
S
T
解答例
var lines = [];
var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', function (line) {
lines.push(line);
});
reader.on('close', function () {
const S = lines[0];
const T = lines[1];
// console.log(S,typeof(S));
const reg = new RegExp(T);
const result = S.search(reg);
console.log(result === -1 ? 'No' : 'Yes');
});
解説
正規表現を使い、目的の文字列が含まれているかを判定した。
C - RANDOM
問題文
と . からなる H 行 W 列の図形 S,T が与えられます。
図形 S は H 個の文字列として与えられ、 Si の j 文字目は S の i 行 j 列にある要素を表します。 T についても同様です。
S の列を並べ替えて T と等しくできるか判定してください。
但し、図形 X の列を並べ替えるとは、以下の操作を言います。
(1,2,…,W) の順列 P=(P1 ,P2 ,…,PW) をひとつ選択する。
その後、全ての 1≤i≤H を満たす整数 i について、以下の操作を同時に行う。
1≤j≤W を満たす全ての整数 j について同時に、 X の i 行 j 列にある要素を i 行 Pj列にある要素に置き換える。
入力
入力は以下の形式で標準入力から与えられる。
H W
S1
S2
⋮
SH
T1
T2
⋮
TH
#解答例
var lines = [];
var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', function (line) {
lines.push(line);
});
reader.on('close', function () {
const [height, width] = lines.shift().split(' ').map(el=>parseInt(el, 10));
// console.log(height, width);
const S = lines.slice(0, height);
const H = lines.slice(height);
// console.log(S, 'S');
// console.log(H, 'H');
let ans = 'Yes';
for(let i = 0; i < height; i++){
let s_count = 0;
let h_count = 0;
S[i].split('').forEach(el => {
if(el === '#'){s_count++}
return;
})
H[i].split('').forEach(el => {
if(el === '#'){h_count++}
return;
})
// console.log(i, s_count, h_count);
if(s_count !== h_count){
ans = 'No';
break;
}
}
console.log(ans);
});
解説
S
グループとT
グループの各列の#
の数を数え、
全て同じであれば、Yes
を返し、それ以外はNo
を返す
終わりに
JavaScriptの解答例が少ないので、競技プログラミングにJSerの人がもっと増えることを願っています!