본문 바로가기
2. 우당탕탕 개발자/2-1. 공부기록

2021.8.4 TIL 자리수의 합, 뒤집은 소수, 멘토링 경우의 수

by Little Monkey 2021. 8. 4.
반응형

 

 

자릿수의 합

N개의 자연수가 입력되면 각 자릿수의 합을 구하고, 그 중 합이 최대인 자연수를 출력. 만약 자릿수의 합이 같을 경우 원 숫자가 큰 것을 리턴한다.

 

function solution(arr) {
  let answer;
  // code here;
  return answer;
}

let example = [128, 460, 603, 40, 521, 137, 123]
console.log(solution(example)); //137

 

 

답1) 각 배열의 원소들을 돌면서 문자열로 변환 후 한자리씩 쪼개어 최대 합을 구한다.

 

function solution(arr) {
  let answer= max = Number.MIN_SAFE_INTEGER;

  for(let el of arr) {
    let str = '' + el; //el.toString();
    let sum = str.split('').reduce((a, b) => a += Number(b), 0);
    if(Math.max(max, sum) === sum) {
      answer = Math.max(answer, el);
      max = sum;
    }
  };

  return answer;
}

 

 

답2) 각 배열의 원소들을 돌면서 10으로 나눠 자릿수를 구한 후 합을 구한다.

 

function solution(arr) {
  let answer = max = Number.MIN_SAFE_INTEGER;

  for(let el of arr) {
    let sum = 0, temp = el;
    while(temp) {
      sum += temp % 10;
      temp = Math.floor(temp/10);
    }
    if(Math.max(max, sum) === sum) {
      max = sum; 
      answer = Math.max(answer, el);
    }
  };

  return answer;
}

 

 

뒤집은 소수

자연수의 배열을 돌면서, 숫자를 거꾸로 뒤집고 그 숫자가 소수면 리턴

 

function solution(arr) {
  let answer;
  // code here;
  return answer;
}

let example = [32, 55, 62, 20, 250, 370, 200, 30, 100];
console.log(solution(example)); 
//[23, 2, 73, 2, 3]

 

소수(Prime number) 구하기

소수는 자기 자신과 1만을 제외하고는 다른 수로 나눠지지 않는 수. 대표적인 예로는 2, 3, 5, 7 등이 있다. n/2까지 하나하나씩 돌아가며 나눠지는지 체크하거나 n의 제곱수Math.sqrt() 까지 하나하나씩 숫자들을 나눠보는 방법이 있다.

 

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;
};

 

 

답) 숫자를 거꾸로 뒤집는 방법은 위의 문제와 유사. 문자화 하여 뒤집거나 / 10으로 나눠서 한자리씩 뒤집는 방법

 

function solution(arr) {
  let answer = [];
  const 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;
  };

  for(let el arr) {
    let temp = el, reverse = 0;
    while (temp) {
      reverse = reverse* 10 + temp % 10;
      temp = parseInt(temp / 10);
    }
    answer.push(reverse);
  }
    answer = answer.filter(el => isPrime(el));  
  return answer;
}

 

 

멘토링

1:1 멘토는 멘티보다 언제나 등수가 낮아야 한다 (등수는 1등이 2등보다 잘하는 거니까). (1 - N)명의 학생이 (1- M)번의 테스트를 본 후, 테스트 별 등수가 배열로 주어진다. 가능한 멘토링 경우의 수는?

 

function solution(arr) {
  let answer;
  // code here
  return answer;
}

let example = [[3, 4, 1, 2], [4, 3, 2, 1],[3, 1, 4, 2]];
console.log(solution(example)) //3

 

 

이 때 예시의 1 - 4번은 학생의 고유의 번호다. 1번째 테스트의 경우 3번 학생이 1등, 4번 학생이 2등, 1번 학생이 3등, 2번 학생이 4등이다. (3, 1), (3, 2), (4, 2)의 3가지 경우가 가능하기 때문에 답은 3번이다.

 

function solution(arr) {
  let answer = 0;
  const m = arr.length; //test 총 횟수 
  const n = arr[0].length; // 학생 명 수

  for(let i = 1; i < n+1; i++) { //멘티가 될 수 있는 학생의 번호
    for(let j = 1; j < n+1; j++) { //멘토가 될 수 있는 학생의 번호
      if(i === j) continue; //본인은 멘티-멘토가 될 수 없다.
      let cnt = 0; // 모든 테스트에서 멘티-멘토가 성립하는지 체크하는 flag
      for(let t = 0; t < m; t++) { //테스트 차 수
        let rankI = arr[t].indexOf(i); //t번째 테스트에서 i학생의 등수
        let rankJ = arr[t].indexOf(j); //t번째 테스트에서 j학생의 등수
        if(rankI < rankJ) cnt++; // 등수가 낮을 수록 점수가 높은 거
      }
      if(cnt === m) answer++; //테스트 전체를 돌았는데, 멘티-멘토가 성립하는지 체크
    }
  };

  return answer;
};

 

 

 

반응형

댓글