본문 바로가기
개발/알고리즘 풀기

for, foreach 문의 차이, 최대공약수/최소공배수 구하기, 소수찾기

by 코딩하는짱구 2023. 11. 10.
반응형

코딩테스트 관련 면접 준비용 자료 

코딩테스트 관련 면접 준비용 자료 

1.for, foreach 차이 파악

2.배열내의 숫자들로 이루어진 최소공배수의 총합 구하기

3. 배열내의 숫자들 중 소수만 찾아서 총합 구하기

위의 목차를 클릭하면 해당 글로 자동 이동 합니다.

 

1. for, foreach 차이 파악

아래와 같은 점수가 주어질 때 1,3,5 번  답을 선택한 사람중 max score 구하기 

1-1. for 문으로 구하기 

const arr2 = [
  { answer: 1, score: 3 },
  { answer: 3, score: 4 },
  { answer: 5, score: 5 },
];

function highestScore(arr) {
  const scores = {
    a: 0,
    b: 0,
    c: 0,
  };

  //for 문으로
  for (let i = 0; i < arr.length; i++) {
    const score = arr[i];
    const answer = score.answer;
    const scoreNum = score.score;

    if (answer === 1) {
      scores.a += scoreNum;
    } else if (answer === 3) {
      scores.b += scoreNum;
    } else if (answer === 5) {
      scores.c += scoreNum;
    }
  }

  //a,b,c에 해당하는 가장 높은 score 까지 구함
  let result = '';
  const maxScore = Math.max(scores.a, scores.b, scores.c);
  console.log(maxScore);

  //가장 높은 score를 가진 응시자 반환
  for (const key in scores) {
    if (scores[key] === maxScore) {
      if (result !== '') {
        result += ',';
      }
      result += `${key}:${maxScore}`;
    }
  }
  return result;
}

const result = highestScore(arr2);
console.log(result);

 

1-2. foreach 문으로 구하기 

const arr1 = [
  { answer: 1, score: 5 },
  { answer: 3, score: 3 },
  { answer: 2, score: 4 },
];

const arr2 = [
  { answer: 1, score: 3 },
  { answer: 3, score: 4 },
  { answer: 5, score: 4 },
];

function highestScore(arr) {
  const scores = {
    a: 0,
    b: 0,
    c: 0,
  };

  arr.forEach((obj) => {
    //answer, score 로 이루어진 arr 에서
    const answer = obj.answer;
    const score = obj.score;
    //배열에서 1,3,5 에 해당하는 score 책성하고 a,b,c 응시자에게 할당
    if (answer === 1) {
      scores.a += score;
    } else if (answer === 3) {
      scores.b += score;
    } else if (answer === 5) {
      scores.c += score;
    }
  });
  //가장 높은 score 까지 구함
  let result = '';
  const maxScore = Math.max(scores.a, scores.b, scores.c);
  console.log(maxScore);

  //가장 높은 score를 가진 응시자 반환
  for (const key in scores) {
    if (scores[key] === maxScore) {
      if (result !== '') {
        result += ',';
      }
      result += `${key}:${maxScore}`;
    }
  }
  return result;
}

const result = highestScore(arr2);
console.log(result);

 

✔ for 문과 foreach의 차이

1. 동기와 비동기: for문은 동기방식 이기 때문에 오류가 나면 오류가 난 위치 이후의 작업이 동작하지 않음

2. 성능차이: forEach문은 '향상된 for문'이라고 칭하는데, 그 이유는 가변적인 배열이나 리스트 크기를 구할 필요가 없어 복잡한 반복문에 적합하며, 인덱스를 생성하여 접근하는 for문보다 수행속도가 빠르다. 

3. 간결한 코드: foreach문은 코드를 간결하게 작성할 수 있고 콜백 함수를 활용하여 반복되는 코드를 모듈화 할 수 있다. 

✔ foreach 문의 단점

1. 반복문 내에서 배열이나 리스트 값을 변경하거나 추가할 수 없다.
ex) for 문에서는 배열의 특정 인덱스에 접근하여 조작할 수 있다. 

2. 중간에 반복을 중단할 수 없으며 건너 뛸 수 없다.

 

 

 

2. 배열내의 숫자들로 이루어진 최소공배수의 총합 구하기

방법: 가장 먼저 최소공배수를 구하기 위한 최대공약수를 계산한다. 도출된 최대공약수를 통해 최소공배수를 계산하는 함수를 만든다. ==> arr를 for문으로 돌며 처리한다. 

//최대공약수 구하기 *GCD = Greatest Common Divisor 
getGCD(a,b)

function getGCD(a, b) {
  if (b === 0) {
    return a;
  } else {
    return getGCD(b, a % b);
  }
}

b가 0일 때는 더이상 나눌 수 있는 수가 없다는 의미이므로 a가 최대공약수가 된다. 따라서 a를 반환.
만약 a,b가 2,14라고 가정한다면 14, 2%14 의 작업을 b가 0이 될때까지 수행함으로써 최종적으로 최대공약수인 a를 반환한다. 

 

//최소공배수 구하기 *LCM = Least Common Multiple 
getLCM(a,b)

최소공배수는 그 수들의 곱을 최대공약수로 나누어주는 방식으로 구한다. 따라서 위에서 구현한 최대공약수 함수를 넣어줌. 

function getLCM(a, b) {
  return (a * b) / getGCD(a, b);
}

 

//최종 코드 

function getGCD(a, b) {
  if (b === 0) {
    return a;
  } else {
    return getGCD(b, a % b);
  }
}

function getLCM(a, b) {
  return (a * b) / getGCD(a, b);
}

const arr = [1, 2, 3]; //2,6,3
const arr2 = [4, 5, 6]; //20,12,30

function solution(arr) {
  let totalLCM = 0;

  for (let i = 0; i < 3; i++) {
    for (let j = i + 1; j < 3; j++) {
      const lcm = getLCM(arr[i], arr[j]);
      console.log(lcm);
      totalLCM += lcm;
    }
  }

  return totalLCM;
}

const result = solution(arr2);
console.log(result);

 

 

 

3. 배열내의 숫자들 중 소수만 찾아서 총합 구하기

const a = 5;
const b = 7; //2,3,5,7

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

console.log(isPrime(5));

function sumOfprimes(a) {
  let sum = 0;

  for (let i = 2; i <= a; i++) {
    if (isPrime(i)) {
      sum += i;
    }
  }
  return sum;
}

console.log(sumOfprimes(a));

 

 

 

 

반응형