学習アルゴリズム5日目


勉強する


sort()Askyコード


29. フリップバイナリ


問題の説明


パラメータは自然数nを与える.nを三進法で前後に逆さまにし、それを十進法で表す数で返し、解関数を完成させる.

せいげんじょうけん


nは10000000を超える自然数である.

解決する

function solution(n) {
  //n = 45
  let answer = 0;
  let arr = [];
  do {
    arr.push(n % 3); //나머지    0  0  2  1
    n = Math.floor(n / 3); //몫 15  5  1  0
  } while (n > 0);

  let l = arr.length;
  //0 * 3**3 + 0 * 3**2  + 2 * 3**1 + 1 * 3**0
  for (let a of arr) {
    answer += a * 3 ** (l - 1);
    l--;
  }
  return answer;
}

チームメンバーコード(関数置換アレイを使用)


TOStringとParseIntの新しい使い方を知りました.
function solution(n) {
  //n = 45
  let answer = [];
  let third = n.toString(3); //문자열로 변환, 삼진법으로 변환 '1200'
  answer = third.split("").reverse().join(""); // ['0021']
  //third.split('')   ['1','2','0','0']
  //third.split('').reverse()  ['0','0','2','1']

  return parseInt(answer, 3); //answer 3진법을 10진법으로 변환한다.
  //parseInt([...n.toString(3)].reverse().join(""), 3)
}
solution(45);

30.最小長方形


問題の説明


名刺入れを作っている会社は財布の大きさを確認したいです.様々な形や大きさの名刺を収納でき、コンパクトで持ち運びに便利な財布を作る必要があります.これらの要件を満たすために、設計チームはすべての名刺の横方向と縦方向の長さを調査した.
次の表に、4種類の名刺の水平と垂直の長さを示します.
名刺番号横長縦長
1 60 50
2 30 70
3 60 30
4 80 40
最も長い横長と縦長はそれぞれ80と70であるため、80(横)x 70(縦)サイズの財布を作成すると、すべての名刺を収容することができる.ただし、横に2番の名刺を収納する場合は、80(横)x 50(縦)サイズの財布ですべての名刺を収納できます.財布のサイズは4000(=80 x 50)です.
パラメータは、すべての名刺の水平と垂直の長さを表す2 D配列サイズです.すべての名刺を収納できる最小財布を作成する場合は、財布の大きさを返すための解関数を完了します.

せいげんじょうけん


sizesの長さは10000より大きい.
sizesの要素は[w,h]形式です.
w名刺の水平長さを表す.
hは名刺の垂直な長さを表す.
wとhは1以上1000以下の自然数である.

解決する

function solution(sizes) {
  let answer = 0;
  let w = [];
  let h = [];
  for (let s of sizes) { //세로 값에 더 긴 쪽이 가도록 모두 정렬
    s.sort(function (a, b) {
      return a - b;
    });
  }
  //sizes =[[ 7, 10 ], [ 3, 12 ], [ 8, 15 ], [ 7, 14 ], [ 5, 15 ]]

  for (let i = 0; i < sizes.length; i++) {
    for (let j = 0; j < sizes[i].length; j++) {
      w.push(sizes[i][0]); //[7, 3, 8, 7, 5] //가로 배열
      h.push(sizes[i][1]); //[10, 12, 15, 14, 15] //세로 배열
    }
  }
  answer = Math.max(...w) * Math.max(...h); //각각 비교해 최댓값찾아 곱함
  return answer;
}
//입력 테스트
solution([
  [10, 7],
  [12, 3],
  [8, 15],
  [14, 7],
  [5, 15],
]);

31.我不喜欢同样的数字。


問題の説明


配列arr.アレイarrの各要素は、0から9の数字で構成されています.この場合、アレイarrは連続して表示される数字を1つだけ保持し、すべて削除しようとします.ただし、削除後に残数を返す場合は、アレイarr内の要素の順序を維持する必要があります.たとえば、
arr=1,3,3,0,1]の場合、[1,3,0,1]が返される.
arr=[4,4,3]の場合は[4,3]を返します.
配列arrから連続して現れる数字を削除し、残りの数を返すsolution関数を完了してください.

せいげんじょうけん


アレイarrサイズ:1000000以下の自然数
アレイarr内の要素のサイズ:0以上、9以下の整数

解決する


後の要素と一致しない場合はpush to response
function solution(arr) {
  let answer = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== arr[i + 1]) {
      answer.push(arr[i]);
    }
  }
  return answer;
}
solution([4, 4, 4, 3, 3]);

失敗


効率0分、ARR長さ最大100万個
function solution(arr) {
  let answer = [];
  let delIndex = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === arr[i + 1]) {
      //제거할 값의 인덱스를 찾는다 [ 0, 1, 3 ]
      delIndex.push(i);
    }
  }
  for (let index of delIndex) {
    //arr에서 해당 인덱스 값을 []로 바꾼다 (그냥 제거하면 인덱스가 바뀌므로 교체 )
    arr.splice(index, 1, []);
    //[ [], 4, 4, 3, 3 ]
    //[ [], [], 4, 3, 3 ]
    //[ [], [], 4, [], 3 ]
  }

  arr = arr.join("").split(""); //공백 []을 제거해 다시 쪼갠다  [ '4', '3' ]

  for (let a of arr) {
    //요소를 숫자로 변환해 넣는다.
    answer.push(parseInt(a)); //[4,3]
  }

  return answer;
}
solution([4, 4, 4, 3, 3]);

32.从两个拖下来就足够啦。


問題の説明


整数配列番号.numbersから異なるインデックスの2つの数を抽出し、作成できるすべての数を昇順に配列に入れ、solution関数の戻りを完了してください.

せいげんじょうけん


numbersの長さは2または100以下です.
numbersのすべての数字は0または100以下です.

解決する

function solution(numbers) {
  let answer = [];
  let arr = [];
  for (let i = 0; i < numbers.length; i++) {
    //두 인덱스를 더해 나오는 모든 조합을 구한다.
    for (let j = 0; j < numbers.length; j++) {
      if (i !== j) {
        //자기자신끼린 더하지 않도록 한다.
        arr.push(numbers[i] + numbers[j]);
      }
    }
  }

  arr.sort(function (a, b) {
    //오름차순으로 정리한다
    return a - b;
  });
  for (let i = 0; i < arr.length; i++) {
    //유일값만 answer에 추가한다.
    if (arr[i] !== arr[i + 1]) {
      answer.push(arr[i]);
    }
  }
  return answer;
}

Set()を使用して重複値を簡単に削除

function solution(numbers) {
  let answer = [];
  let arr = [];
  for (let i = 0; i < numbers.length; i++) {
    //두 인덱스를 더해 나오는 모든 조합을 구한다.
    for (let j = 0; j < numbers.length; j++) {
      if (i !== j) {
        //자기자신끼린 더하지 않도록 한다.
        arr.push(numbers[i] + numbers[j]);
      }
    }
  }
  answer = [...new Set(arr)]; //전개 연산자와 Set을 이용해 유일값만 남긴다.
  answer.sort(function (a, b) {
    //오름차순으로 정리한다
    return a - b;
  });

  return answer;
}

チームメンバーコード


答えに含まれている要素は含まれておらず、重複値を除外します.
function solution(numbers) {
  let answer = [];
  for (let i = 0; i < numbers.length; i++) {
    // i를 numbers의 길이만큼 반복
    for (let j = i + 1; j < numbers.length; j++) {
      // j를 i+1길이만큼 반복
      let plus = numbers[i] + numbers[j]; // plus는 number의 [i]+[j]
      if (!answer.includes(plus)) answer.push(plus); // 만일 answer에 includes(plus)가 없으면 answer에 push
    }
  }
  answer.sort((a, b) => a - b); // answer 오름차순으로 정렬
  return answer;
}

33.乐透最高和最低排名


長い話ですが、消去された数が正しい場合の等号と消去された数が間違っている場合の等号をそれぞれ求めます.

問題の説明


楽透6/45(以下「楽透」と略称する)は典型的な宝くじで、1~45の数字に6つ印刷して推測することができる.次は宝くじのランキングを決める方法です.1

宝くじを購入したミンウは、当選番号の発表日を楽しみにしていた.しかし、敏宇の弟は宝くじに落書きをして、番号の一部が分からなくなった.当選番号が発表された後、敏宇は自分が購入した宝くじの当選の最高順位と最低順位を知りたいと思っています.
購入した6つの宝くじ番号が44、1、0、0、3125だとします.6つの当選番号がそれぞれ31、10、45、1、6、19の場合、当選可能な最高および最低の例は以下の通りである.

順序のいかんにかかわらず、購入した宝くじに当選番号に該当する番号があれば、正解と認定されます.
10と6の2つの知らない番号を持っていると、3位になります.
他にも3位を作る方法があります.しかし、私たちはそれを2位以上にすることはできません.
11と7の2つの知らない番号があるとします.5位になります.
他にも5位を作る方法があります.しかし、彼を6位にすることは不可能だ.
パラメータは敏宇が購入した宝くじ番号を含む宝くじ、当選番号の宝くじである.このとき、可能な最高順位と最低順位を配列に順番に入れて戻ります.

せいげんじょうけん


lottosは整数配列で、長さは6です.
lottosのすべての要素は45以下の整数です.
0は認識できない数字を表します.
0以外の数字はlottosで2つを超えない.
lottosの要素が整列していない可能性があります.
win numsは長さ6の整数配列である.
win numsのすべての要素は1または45未満の整数です.
win numsには同じ数字が複数含まれていません.
win numsの要素が整列していない可能性があります.

解決する

function solution(lottos, win_nums) {
  let answer = [];
  let eq_count = 0; //일치 개수
  let zero = 0; //지워진 수(0)의 개수

  const rank = [6, 6, 5, 4, 3, 2, 1]; //순위 책정표를 배열로 정리
  //인덱스는 맞은 개수 값은 등수를 의미. 즉, rank[0] =6이면 0개 맞추면 6등이란 뜻

  for (let my of lottos) {
    if (my === 0) {
      //0이 몇 개인지
      zero++;
    }
    if (win_nums.includes(my)) {
      //win_numbers에 lottos의 요소가 몇 개 인지
      eq_count++;
    }
  }
  answer = [rank[eq_count + zero], rank[eq_count]];
  return answer;
}

34.模擬試験


問題の説明


数学は数学を放棄する人の略語である.「囚人3人組」は模擬試験で数学の問題を全部撮りたいと思っている.最初の問題から最後の問題まで、執胞子は以下の通りである.
1番捕手の撮り方:1,2,3,4,5,1,2,3,4,5...
2番捕手の撮り方:2、1、2、3、2、4、2、5、2、2、3、2、4、2、5...
3番捕手の撮り方:3,3,1,1,2,2,4,5,5,3,3,1,2,2,4,5,5...
最初の問題から最後の問題までの正解が順番に並んでいる場合は、最も多くの質問に答えた人が誰なのか、答えを並べて返すように解答関数を書いてください.

せいげんじょうけん


試験には最大10000問が含まれている.
質問の答えは1 2 3 4 5のうちの1つです.
点数が一番高い人が何人かいる場合は、戻った値を昇順に並べてください.

解決する


あなたが何をしているのか分からないコード.
正、逆インデックスが各水泡のつけ列の倍数である場合、水泡インデックスを0から再比較する.ただしindex=j%test[i].lengthこれで残りの人は自分で0から回ります
そしてこの3つの泡を一度に計算するために、印の配列を1つの配列に打ち込んだ.
(確かに正解でした…)
function solution(arr) {
  let answer = [];
  let test = [
    [1, 2, 3, 4, 5],
    [2, 1, 2, 3, 2, 4, 2, 5],
    [3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
  ];
  let count_arr = []; //맞은 개수 담는 배열, 인덱스+1이 수포자 번호다.
  let max = 0; //위 배열의 최댓값
  for (let i = 0; i < test.length; i++) {
    let count = 0; //맞은개수
    let index = 0;
    for (let j = 0; j < arr.length; j++) {
      index = j % test[i].length ? index + 1 : 0; //정답배열의 인덱스(j)가 수포자배열로 나누어떨어지면 index는 0 아니면 1씩 증가한다.
      //그냥 index = j%test[i].length이렇게 쓰면 되는 거였다...
      if (arr[j] === test[i][index]) {
        //맞은 개수를 체크한다.
        count++;
      }
    }
    count_arr.push(count); //맞은개수를 배열에 넣는다.
  }
  console.log(count_arr);
  max = Math.max(...count_arr); //맞은개수들의 가장큰 값을 구한다
  for (let i = 0; i < count_arr.length; i++) {
    if (count_arr[i] === max) {
      //최고 득점 수포자번호를 answer배열에 담는다.
      answer.push(i + 1);
    }
  }
  return answer.sort(); //answer를 오름차순 정렬해 리턴한다.(바로 위 for문에서 i순으로 push했으니 정렬 안 해도 되는 듯)
}

他人の解答


プログラマーで見つける
私と解決の順序はあまり違わない.
function solution(answers) {
  var answer = [];
  const man1 = [1, 2, 3, 4, 5];
  const man2 = [2, 1, 2, 3, 2, 4, 2, 5];
  const man3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
  let count = [0, 0, 0];

  for (let i = 0; i < answers.length; i++) {
    if (answers[i] == man1[i % man1.length]) count[0]++;
    if (answers[i] == man2[i % man2.length]) count[1]++;
    if (answers[i] == man3[i % man3.length]) count[2]++;
  }

  const max = Math.max(count[0], count[1], count[2]);
  for (let i = 0; i < count.length; i++) {
    if (max == count[i]) answer.push(i + 1);
  }

  return answer;
}

チームメンバーコード

function solution(answers) {
  let pattern1 = "12345";
  let pattern2 = "21232425";
  let pattern3 = "3311224455";
  let pattern1Score = checking(pattern1);
  let pattern2Score = checking(pattern2);
  let pattern3Score = checking(pattern3);
  let grade = grading(pattern1Score, pattern2Score, pattern3Score);

  function checking(pattern) {
    //각자 몇 개 맞췄는지 체크하는 함수
    let count = 0;
    pattern = pattern
      .repeat(Math.ceil(answers.length / pattern.length))
      .split(""); // 2, 2-1번 로직
    for (let i = 0; i < answers.length; i++) {
      if (answers[i] === +pattern[i]) {
        count++;
      }
    }
    return count;
  }

  function grading(score1, score2, score3) {
    //최고 득점자를 가리는 함수
    let king = [];
    let arr = [score1, score2, score3];
    arr.sort(function (a, b) {
      return b - a;
    });
    if (arr[0] === score1) king.push(1);
    if (arr[0] === score2) king.push(2);
    if (arr[0] === score3) king.push(3);
    return king;
  }
  return grade;
}

36.文字列降順で配置


問題の説明


文字列sに現れる文字を大から小まで順番に並べ替え、新しい文字列を返す関数と解決策を完了します.
sは英語の大文字と小文字のみからなり、大文字は小文字より小さいと見なされます.

せいげんじょうけん


strは、長さが1より大きい文字列です.

解決する


Unicodeは大文字が小文字より小さいと思っていた
sort(function(a,b){return b-a}は降順に変更されず、文字列には別の方法があるようです(学習してください).だからひっくり返した.
function solution(s) {
    let answer = [];
    answer = s.split('')
   
    return  answer.sort().reverse().join("")
}

(+)降順で解決します。


別の方法というより、sortの比較機能を減らすのは数字だけだ.
function solution(s) {
    let answer = [];
    answer = s.split('').sort(function(a,b){
      if(a>b) return -1;
      if(a<b) return 1;
      return 0;
    }).join('')
   
    return  answer
}

39. シーザーのパスワード


問題の説明


1つの暗号化方法は、1つの文の各アルファベットを一定の距離で伸ばし、別のアルファベットに変換することです.例えば、「AB」は1で「BC」、3で「DE」を表す.「z」が1に等しいと「a」になります.文字列sと距離nを入力し、sがnの暗号文の関数を生成し、ソリューションを完了します.

せいげんじょうけん


いくら押してもスペースは空いています.
sは、小文字、大文字、スペースのみから構成されます.
sの長さは8000以下です.
nは1以上,25以下の自然数である.

解決する


Java charタイプでは「a」+1=「b」であるべきです.Askyコードの順番によってjsもこんなの知らないことがあります...結局、アルファベットを壊してしまった.
26文字を2回打ちたくないので、大文字文字列しか作らないので、1ダースずつ打つ人は小文字文字列を作るのが一般的です.
function solution(s, n) {
  const alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  let answer = "";
  for (let a of s) {
    if (a === " ") {
      //공백엔 공백을 저장
      answer += " ";
    } else {
      let alpha_i = alpha.indexOf(a.toUpperCase()); //a가 alpha에선 몇 인덱스에 있는지(대소문자 구부없이 확인)
      if (alpha.includes(a)) {
        //대문자의 경우
        answer += alpha[(alpha_i + n) % 26]; //(alpha_i +n )은 n만큼 밀은 인덱스, alpha 문자열 밖으로 나가면 0부터 다시 시작하므로 %26한다.
      } else if (alpha.includes(a.toUpperCase())) {
        //소문자의 경우 대문자로 변환해 검사하고 다시 소문자로 바꾼다.
        answer += alpha[(alpha_i + n) % 26].toLowerCase();
      }
    }
  }
  return answer;
}

他者コード


プログラマーで見つける
function solution(s, n) {
  let upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  let lower = "abcdefghijklmnopqrstuvwxyz";
  let answer = "";

  for (let i = 0; i < s.length; i++) {
    let text = s[i];
    if (text == " ") {
      answer += " ";
    } else {
      let textArr = upper.includes(text) ? upper : lower;
      let index = textArr.indexOf(text) + n;

      answer += textArr[index % 26];
    }
  }
  return answer;
}

35, 37, 38, 40


いいえ...明日.