3
0

命の水だ、ポンジュース(みかんみかんみかん

自分が中学ぐらいにメタルというジャンルを日本に広めた素晴らしいバンドだったと思う。

面倒くさいので画面パタメータをListでもらった後のFunctionだけ

ちなみに引数のListを作ってる箇所はこっちの記事に書いてあるYO!!

mikan.js
// [問題文(原文)]
// あなたはみかん農園を営んでいます。
// 収穫の季節になると、あなたはみかんを収穫し、重さごとに仕分けなければいけません。
// 仕分け作業は非常に時間がかかる作業なので、あなたはみかんを重さごとに仕分けてくれるプログラムを書くことにしました。
// みかんはある定数 N の倍数のうち、正の整数の重さが書かれた箱に仕分けられます。
// 例えば N = 10 の時、10 g, 20 g, 30 g ... のように仕分けられます。
// そして、そのみかんの重さが一番近い数の重さに仕分けられます。
// 重さが一番近い箱が複数ある場合、数が大きい方の箱に仕分けられます。
// 入力例 1 は以下のようになります。
// 24 g のみかんはより値の近い 20 g と書かれた箱に仕分けられます。
// 35 g のみかんは 30 g, 40 g の箱と差が同じです。この場合は数の大きい方の 40 g の箱へ仕分けてください。
// 0g に仕分けられることはないので、一番小さい重さに仕分けてください。
function mikan(lines) {
  // 入力は以下のフォーマットで与えられます。
  // 
  // N M
  // w_1
  // w_2
  // ...
  // w_M
  // 
  // ・ 1 行目にそれぞれ仕分ける重さの区切りを表す整数、みかんの個数を表す整数 N, M がこの順で半角スペース区切りで与えられます。
  // ・ 続く M 行のうちの i 行目 (1 ≦ i ≦ M) には、i 番目のみかんの重さを表す整数 w_i が与えられます。
  // ・ 入力は合計で M + 1 行となり、入力値最終行の末尾に改行が 1 つ入ります。

  // すべてのテストケースにおいて、以下の条件をみたします。
  // 
  // ・ 1 ≦ N ≦ 100
  // ・ 1 ≦ M ≦ 10
  // ・ 1 ≦ w_i ≦ 1,000 (1 ≦ i ≦ M)
  if (!Array.isArray(lines) || lines.length < 1) {
    console.log("2行以上入れろや!");
    return;
  }
  // 1行目チェック
  const sp = lines[0].split(' ').map(v => Number(v));
  if (sp.length !== 2 && !sp.every((v) => Number.isInteger(Number(v)))) {
    console.log("数値 数値 の形式で入れろや!");
    return;
  } else if (sp[0] < 0 || sp[0] > 100) {
    console.log("1行目:1つ目の数値は1~100の範囲で入れろや!");
    return;
  } else if (sp[1] < 0 || sp[1] > 10) {
    console.log("1行目:2つ目の数値は1~10の範囲で入れろや!");
    return;
  };
  // みかんチェック
  const mikans = lines.slice(1).map(v => Number(v));
  if (sp[1] !== mikans.length) {
    console.log("みかんの数が合わないんや!");
    return;
  } else if (!mikans.every((v) => Number.isInteger(Number(v)) && v >= 0 && v <= 1000)) {
    console.log("みかんの重さは1~1000の整数で入れろや!");
    return;
  }

  // 仕分けるべき重さを以下の形式で出力してください。
  // 
  // 
  // y_1
  // y_2
  // ...
  // y_M
  // 
  // ・ 期待する出力は M 行からなります。
  // ・ i 行目 (1 ≦ i ≦ M) にはそれぞれ i 番目のみかんの仕分け先の重さを表す y_i を出力して下さい。
  // ・ すべて整数で出力してください。
  mikans.forEach((mikan) => {
    if (mikan < sp[0]) {
      // 0 gに仕分けられないので、1番小さい重さを出力
      console.log(sp[0]);
    } else {
      if (mikan % sp[0] === 0) {
        // ぴったりサイズならそのまま出力
        console.log(mikan);
      } else {
        const near = Math.floor(mikan / sp[0])
        // 近いサイズ
        const near1 = near * sp[0];
        // 次のサイズ
        const near2 = (near + 1) * sp[0];
        // diff
        const diff1 = mikan - near1;
        const diff2 = near2 - mikan;
        console.log(diff1 >= diff2 ? near2 : near1);
      }
    }
  });
}

module.exports = {
  mikan
};

ifがだいぶ多い気もするけど結局のところ
・みかんが基準値(最小の箱)より小さければ、最小の箱に入れる
・みかんを基準値で割ってピッタリ割れるなら、そのまま出す
・みかんを基準値で割った数に基準値をかけて下側の箱を割り出す。
 割った数に1足してから基準値を掛けて上側の箱を割り出す。
 それぞれの値とみかんとのDiffとって、
 同じか上側の箱に近かったら上の箱の値を表示、
 ソレ以外なら下の箱を表示

最後だけなんかややこしくなってるけど、きちんと頭で整理すればチョチョイのJOYやで!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0