アルゴリズム学習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;
}
Reference
この問題について(アルゴリズム学習3日目), 我々は、より多くの情報をここで見つけました https://velog.io/@doyeon11/알고리즘-공부-3일차テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol