こういう問題大好き
コレに挑戦
Node(index.js)で正攻法で書いてみた
ちなみに標準出力から値を取得するって部分は、paizaで公開されてるサンプルをそのまま使いました。
index.js
// [問題文(原文)]
// 整数が書かれた複数のカードの中から3枚を選び、
// そこに書かれた整数の和が7で割り切れるかどうかで運勢を決めようというものです。
// カードは必ず異なる3枚を選ぶ必要があり、
// 全てのカードには全て異なる数字が書かれています。
// -- ここから paizaで公開されてるサンプル
process.stdin.resume();
process.stdin.setEncoding('utf8');
const lines = [];
const reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', (line) => {
lines.push(line);
});
// -- ここまで paizaで公開されてるサンプル
// 以下は公開されているものに少しテコ入れしたヤツ
reader.on('close', () => {
const N = lines[0];
// 「カードは必ず異なる3枚を選ぶ必要があり」って書いてあるので、
// 3枚無い場合は0とした
if(N < 3) {
console.log(0);
return;
}
const targetList = [];
for(var i = 0; i < N; i++)
targetList.push(Number(lines[i+1]));
countDivisibleBy7(targetList);
});
// リスト内の組み合わせで7で割れる数を出力するアレ
function countDivisibleBy7(arr) {
let count = 0;
// 3つの要素を選択するための3重ループ
for (let i = 0; i < arr.length - 2; i++)
for (let j = i + 1; j < arr.length - 1; j++)
for (let k = j + 1; k < arr.length; k++)
// 3つの要素の和が7で割り切れるかどうかをチェック
count += (arr[i] + arr[j] + arr[k]) % 7 === 0 ? 1 : 0;
console.log(count);
}
本当なら入力チェックとか渡された値の整合性チェックとかを入れるべきな気もするけど。。。
forネストしててなんかイケテナイ感はあるけど、コレぐらいなら新人とかでもきっと読めるでしょう(ニッコリ
[追記]チェック処理とかなんか色々追加してみた
index.js
// [問題文(原文)]
// 整数が書かれた複数のカードの中から3枚を選び、
// そこに書かれた整数の和が7で割り切れるかどうかで運勢を決めようというものです。
// カードは必ず異なる3枚を選ぶ必要があり、
// 全てのカードには全て異なる数字が書かれています。
// -- ここから paizaで公開されてるサンプル
process.stdin.resume();
process.stdin.setEncoding('utf8');
const lines = [];
const reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', (line) => {
lines.push(line);
});
// -- ここまで paizaで公開されてるサンプル
// 以下は公開されているものに少しテコ入れしたヤツ
reader.on('close', () => {
const totalCnt = Number(lines[0]);
// 数値以外が来た場合は0を表示
// 「カードは必ず異なる3枚を選ぶ必要があり」って書いてあるので、3枚無い場合は0を表示
// 最初に渡されるリストの総数 と 実際に渡ってきた総数がマッチしない場合は0を表示
if (isNaN(totalCnt) || totalCnt < 3 || totalCnt !== lines.length - 1) {
console.log(0);
return;
}
const targetList = [];
for (var i = 0; i < totalCnt; i++) {
const num = Number(lines[i + 1]);
if (isNaN(num)) {
// 数値チェックを実施し、数値以外が来た場合は0を表示
console.log(0);
return;
} else if(!Number.isInteger(num) || num < 0){
// 「整数が書かれた複数のカード」と書いてあるので、少数含む・マイナス値の場合は0を表示
console.log(0);
return;
} else if (targetList.some(n => n === num)) {
// 「全てのカードには全て異なる数字が書かれています。」と書いてあるので、重複していた場合は0を表示
console.log(0);
return;
}
targetList.push(num);
}
countDivisibleBy7(targetList);
});
// リスト内の組み合わせで7で割れる数を出力するアレ
function countDivisibleBy7(arr) {
let count = 0;
// 3つの要素を選択するための3重ループ
for (let i = 0; i < arr.length - 2; i++)
for (let j = i + 1; j < arr.length - 1; j++)
for (let k = j + 1; k < arr.length; k++)
// 3つの要素の和が7で割り切れるかどうかをチェック
count += (arr[i] + arr[j] + arr[k]) % 7 === 0 ? 1 : 0;
console.log(count);
}
パラメータに以下のような不正値が来た場合に0を表示します。
駄目なパラメータ1(3つ選べない)
2
1
2
駄目なパラメータ2(3つ来るはずなのに2つしか来ない(数が合わない))
3
1
2
駄目なパラメータ3(整数以外が入ってくる:英字)
3
1
a
3
駄目なパラメータ3(整数以外が入ってくる:小数点含む)
3
2.5
4.5
7
駄目なパラメータ3(整数以外が入ってくる:マイナス値含む)
3
-7
-14
7