N개의 자연수가 입력되면 각 자연수의 자릿수의 합을 구하고, 그 합이 최대인 자연수를 출력 하는 프로그램을 작성하기. 자릿수의 합이 같은 경우 원래 숫자가 큰 숫자를 답으로 한다.
function solution(n, arr) {
let answer,
max = Number.MIN_SAFE_INTEGER;
for (let x of arr) {
//1. while 이용하기
// let sum = 0,
// let tmp = x; //x을 바로 변형시키면 안됌. 임시변수 필요 answer에 x 원본 값을 주어야 하므로
// while (tmp) {
// sum += tmp % 10;
// tmp = Math.floor(tmp / 10);
// }
//2. 내장함수 이용 (훨씬 간편)
let sum = x
.toString()
.split("")
.reduce((a, b) => a + Number(b), 0);
if (sum > max) {
max = sum;
answer = x;
} else if (sum === max) {
if (x > answer) answer = x;
}
}
return answer;
}
let arr = [128, 460, 603, 40, 521, 137, 123];
console.log(solution(7, arr)); //137
N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 소수를 출력하 는 프로그램을 작성하기. 첫 자리부터의 연속된 0은 무시한다.
function isPrime(num) {
const checkPrimes = [2, 3, 5, 7];
for (let x of checkPrimes) {
if (num % x === 0) {
return false;
} else {
return num;
}
}
}
function solution(arr) {
let answer = [];
for (let x of arr) {
let num = parseInt(x.toString().split("").reverse().join(""));
answer.push(isPrime(num));
}
return answer;
}
//선생님 풀이
function isPrime(num) {
if (num === 1) return false;
for (let i = 2; i <= parseInt(Math.sqrt(num)); i++) {
if (num % i === 0) return false;
}
return true;
}
function solution(arr) {
let answer = [];
for (let x of arr) {
//1. while 사용하기
let res = 0;
while (x) {
let t = x % 10;
res = res * 10 + t;
x = parseInt(x / 10);
}
//2. 내장함수 사용하기
let res = Number(x.toString().split("").reverse().join(""));
if (isPrime(res)) answer.push(res);
}
return answer;
}
let arr = [32, 55, 62, 20, 250, 370, 200, 30, 100];
console.log(solution(arr)); //[23, 2, 73, 2, 3]
M번의 수학테스트 등수를 가지고 멘토와 멘티를 정한다.만약 A학생이 멘토이고, B학생이 멘티가 되는 짝이 되었다면, A학생은 M번의 수학테스트에서 모두 B학생보다 등수가 앞서야 한다. M번의 수학성적이 주어지면 멘토와 멘티가 되는 짝을 만들 수 있는 경우가 총 몇 가지 인지 출력하는 프로그램을 작성하기.
3412 의 경우 3번의 1등을 한 것!
function solution(test) {
let answer = 0;
let m = test.length;
let n = test[0].length; // 열의 개수
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= n; j++) {
let cnt = 0;
for (let k = 0; k < m; k++) {
let pi = (pj = 0); //등수
for (let s = 0; s < n; s++) {
if (test[k][s] === i) pi = s; // i 등수
if (test[k][s] === j) pj = s;
}
if (pi < pj) cnt++; // 3개의 시험에서 통과한 횟수
}
if(cnt === m)answer++; // 3번 다 pi <pj이어야 하므로!
}
}
return answer;
}
let arr = [
[3, 4, 1, 2],
[4, 3, 2, 1],
[3, 1, 4, 2],
];
console.log(solution(arr)); //3
배열의 개수와 상품의 가격과 배송비로 이루어진 배열의 모음을 인자로 받는다.
하나의 상품만 50% 할인받는 것이 가능하다. 배송비는 할인에 포함되지 않는다. 살 수 있는 최대한의 상품의 갯수를 구하는 프로그램 만들기.
function solution(m, product) {
let answer = 0;
let n = product.length;
product.sort((a, b) => a[0] + a[1] - (b[0] + b[1]));
for (let i = 0; i < n; i++) {
let money = m - (product[i][0] / 2 + product[i][1]);
let cnt = 1;
for (let j = 0; j < n; j++) {
if (j !== i && product[j][0] + product[j][1] > money) break;
if (j !== i && product[j][0] + product[j][1] <= money) {
money -= product[j][0] + product[j][1];
cnt++;
}
}
answer = Math.max(answer, cnt);
}
return answer;
}
let arr = [
[6, 6],
[2, 2],
[4, 3],
[4, 5],
[10, 3],
];
console.log(solution(28, arr)); //4
N개의 카드 중 3장을 뽑을 수 있는 모든 경우의 수를 구해 이중 K번째로 큰 수를 출력하는 프로그램을 만들어라.
//나의 풀이
function solution(n, k, card) {
let answer = 0;
let sums = [];
for (let i = 0; i < n; i++) {
for (let j = 1; j < n; j++) {
let sum = 0;
for (let k = 2; k < n; k++) {
sum = arr[i] + arr[j] + arr[k];
}
sums.push(sum);
}
}
sums.sort((a, b) => b - a);
const setSums = new Set(sums);
console.log(setSums);
answer = setSums[k - 1];
return answer;
}
//선생님 풀이
function solution(n, k, card) {
let answer;
let tmp = new Set(); // set이라는 객체를 만들어주자
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
for (let k = j + 1; k < n; k++) {
tmp.add(card[i] + card[j] + card[k]);
}
}
}
let a = Array.from(tmp).sort((a, b) => b - a);
answer = a[k - 1];
return answer;
}
let arr = [13, 15, 34, 23, 45, 65, 33, 11, 26, 42];
console.log(solution(10, 3, arr)); //143
⭐️ 핵심 포인트 set => 중복을 제거하자