アルゴリズム学習3日目


22.数値桁数の追加


問題の説明


自然数Nが与えられた場合,Nの各数の和を求め,返される解関数を求める.
たとえば、N=123の場合、1+2+3=6を返します.

せいげんじょうけん


Nの範囲:10000000以下の自然数

解決する


文脈

function solution(n) {
  let answer = 0;
  let num = String(n).length;  //n의 자릿수 구하기
  for (let i = 0; i < num; i++) { //자릿수만큼 반복
    answer += n % 10;  //나머지(자릿수별로 나눔)
    n = Math.floor(n / 10);  //몫
  }

  return answer;
}

do-while文


桁数を求める必要はありません.
function solution(n) {
  let answer = 0;

  do {
    answer += n % 10;
    n = Math.floor(n / 10);
  } while (n > 0);

  return answer;
}

チームメンバーの解析(文字列に変換)

function solution(n) {
  let answer = 0;
  let a = String(n); //숫자를 문자로 변환 '1','2','3'

  for (let i = 0; i < a.length; i++) {
    // i는 0부터 a의 길이전까지 i증가
    answer += parseInt(a[i]); //parseInt()=> 문자를 정수로 변환
  }
  return answer;
}

23.自然数列の反転


ほとんど上の問題と同じです

問題の説明


自然数nを逆さまにして、各数字を要素の配列で返します.例えば、nが12345の場合、[5,4,3,2,1]が返される.

せいげんじょうけん


nは10000000以下の自然数である.

解決する


文脈

function solution(n) {
  //n= 12345
  let answer = [];
  let num = String(n).length;
  for (let i = 0; i < num; i++) {
    answer.push(n % 10); //나머지     5  //  4   //3  //2  //1
    n = Math.floor(n / 10); //몫    1234 //123 //12 //1  //0
  }

  return answer; //[5,4,3,2,1]
}

do-while文

function solution(n) {
  let answer = [];

  do {
    answer = push(n % 10);
    n = Math.floor(n / 10);
  } while (n > 0);

  return answer;
}

24.整数降順で配置


問題の説明


関数解は、パラメータ入力として整数nを受け入れる.nの各ビット数を大きいから小さい順に並べ替えてください.例えば、nが118372の場合、873211が返される.

せいげんじょうけん


nは8000000000より大きい自然数である.

解決する

function solution(n) {
  //12345
  let arr = [];
  let answer = "";
  let num = String(n).length;
  for (let i = 0; i < num; i++) {
    arr.push(n % 10); //나머지     5  //  4   //3  //2  //1
    n = Math.floor(n / 10); //몫    1234 //123 //12 //1  //0
  }
  //내림차순 정렬
  arr.sort(function (a, b) {
    return b - a;
  });
  for (let i = 0; i < arr.length; i++) {
    answer += String(arr[i]);
  }

  return answer * 1;
}

何度も平方を使ってみる

function solution(n) {
  //12345
  let arr = [];
  let answer = 0;
  let num = String(n).length;
  for (let i = 0; i < num; i++) {
    arr.push(n % 10); //나머지     5  //  4   //3  //2  //1
    n = Math.floor(n / 10); //몫    1234 //123 //12 //1  //0
  }
  arr.sort(function (a, b) {
    return b - a;
  });
  for (let a of arr) {
    answer += a * 10 ** (num - 1);
    num--;
  }

  return answer;
}

簡単な配列

function solution(n) {
  //12345
  let arr = [];
  let num = String(n).length;
  for (let i = 0; i < num; i++) {
    arr.push(n % 10); //나머지     5  //  4   //3  //2  //1
    n = Math.floor(n / 10); //몫    1234 //123 //12 //1  //0
  }
  

  return arr.sort().reverse().join('') * 1;
}

リファレンス


sort()はUnicodeの順にインクリメントされますが、1桁は0から9しかないので使用することもできます.
reverse()は逆順に並べられています.つまり、sort()です.逆順()は降順です.
join()は配列内の要素を接続し、文字列を形成します.

25.整数平方根の判別


問題の説明


任意の正の整数nについて、nがある正の整数xの二乗であるか否かを判断しようとする.
nが正の整数xの平方である場合、x+1の平方を返し、nが正の整数xの平方でない場合、-1を返す関数を完了する.

せいげんじょうけん


nは正の整数であり、5000000000000以上である.

解決する

function solution(n) {
  let answer = 0;
  let x = Math.sqrt(n);//n의 제곱근을 구함
  if (x === parseInt(x)) {//x가 정수인지 판별
  //이렇게도 가능 if(x%1===0)  //if(x===Math.floor(x))
    answer = (x + 1) ** 2;
  } else {
    answer = -1;
  }
  return answer;
}

チームメンバーコードなし(sqrt()メソッド実装)

function solution(n) {
  let result = 0;
  let x = 0;
  while (x * x < n) {//제곱근의 근삿값인 정수 x구하기
    x++;
  }
  if (x * x === n) { //x가 n의 정수 제곱근인지 검사
    result = (x+1) **2;
  } else {
    result = -1;
  }

  return result;
}

26.削除最小数


問題の説明


整数の配列を保存し、arrから最小数の配列を削除する関数を返します.解決策を完了してください.ただし、返される配列が空の配列の場合は、配列に-1を入力して返します.たとえばarrが[4,3,2,1]の場合は[4,3,2]を返し、[10]の場合は[1]を返します.

せいげんじょうけん


arrは長さが1より大きい配列である.
インデックスi,jについて、i≠jの場合、arr[i]≠arr[j]である.

解決する


配列を昇順にソートする場合、インデックス0が最適です.
これを元の配列から外したい(…)
function solution(arr) {
  let answer = [];
  let index = 0;
  for (let a of arr) {
    //배열복사
    answer.push(a);
  }
  answer.sort(function (a, b) {
    //복사한 배열(answer) 오름차순
    return a - b;
  });
  index = arr.indexOf(answer[0]); //answer의 0번째 인덱스값이 arr에선 몇 번 인덱스인지
  arr.splice(index, 1); //찾은 인덱스로 제거하기
  if (arr.length === 0) {
    //빈 배열이면 -1넣어 주기
    arr.push(-1);
  }
  return arr;
}

最新値を検索するデフォルトの重複文の使用


一番高い値段を探していたとき、これはたくさん使いました.
function solution(arr) {
  let index = 0;

  let min = arr[0];
  for (let i = 1; i < arr.length; i++) {
    if (min > arr[i]) min = arr[i];
  }

  index = arr.indexOf(min); //answer의 0번째 인덱스값이 arr에선 몇 번 인덱스인지
  arr.splice(index, 1); //찾은 인덱스로 제거하기
  if (arr.length === 0) {
    //빈 배열이면 -1넣어 주기
    arr.push(-1);
  }
  return arr;
}

Math.min()Spread Operator(展開演算子)またはFunction。prototype.apply()の使用

function solution(arr) {
  let index = 0;
  let min = Math.min(...arr);//전개 연산자 arr배열 값들이 펼쳐져 들어감
  //혹은 let min =Math.min.apply(null,arr)

  index = arr.indexOf(min); //answer의 0번째 인덱스값이 arr에선 몇 번 인덱스인지
  arr.splice(index, 1); //찾은 인덱스로 제거하기
  if (arr.length === 0) {
    //빈 배열이면 -1넣어 주기
    arr.push(-1);
  }
  return arr;
}

27.コラーズの推測


問題の説明


1937年にCollatzが提案したこの推測は,与えられた数が1になる前に次のタスクを繰り返し実行すれば,すべての数を1にすることができるということである.操作は次のとおりです.
1-1. 入力した数字が偶数の場合は2に分けられます.
1-2. 入力した数字が奇数の場合、3を掛けて1を加算します.
2.結果が1になるまで、同じ操作を繰り返します.
例えば、入力された数字が6であれば、6→3→10→5→16→8→4→2→1の計8回が1となる.上記の操作を何回繰り返すかを示す関数を返します.解決策を完了します.ただし、タスクを500回繰り返しても1未満の場合は、-1を返します.

せいげんじょうけん


入力された数値numは1または800000未満の整数です.

解決する

function solution(num) {
  let answer = 0;

  //num이 1이 아닐 때 실행
  while (num !== 1) {
    if (num % 2) {
      //num이 홀수면
      num = num * 3 + 1;
      answer++;
    } else {
      //num이 짝수면
      num = num / 2;
      answer++;
    }
    //answer가 500이상이면 break
    if (answer >= 500) {
      answer = -1;
      break;
    }
  }
  return answer;

28.ハザード数


問題の説明


正の整数xを下のスケール数にするには、xをxの桁数の和で除算する必要があります.例えば、18の桁数の和は1+8=9であり、18は9で除算されるので、18は下付き文字数となる.自然数xを入力し、xがハザード数の関数かどうかをチェックし、解を完了します.

せいげんじょうけん


xは1または10000より大きい整数です.

解決する


参考トップ22号
function solution(x) {
  let answer = false;
  let sum = 0;
  let n = x;

  do {
    sum += n % 10;
    n = Math.floor(n / 10);
  } while (n > 0);

  if (x % sum === 0) {
    answer = true;
  }

  return answer;
}