내일배움캠프 Node.js 본캠프 13일차

김선우·2024년 8월 22일
post-thumbnail

알고리즘 문제풀기

하샤드 수

문제 설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

제한 조건

x는 1 이상, 10000 이하인 정수입니다.

코드

function solution(x) {
  var answer = true;
  var arr = x.toString().split("");
  var sum = 0;
  for (i = 0; i < arr.length; i++) {
    sum += Number(arr[i]);
  }
  if (x % sum === 0) {
    answer = true;
  } else {
    answer = false;
  }
  return answer;
}

작성 이유

x의 자릿수의 합을 구하기 위해 배열로 변환한 뒤 다시 숫자값으로 변환하여 sum이라는 변수에 더해줌. x를 sum으로 나눳을때 나머지가 0이면 하샤드값이므로 true, 아닌경우는 false를 반환.

두 정수 사이의 합

문제 설명

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

제한 조건

a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
a와 b의 대소관계는 정해져있지 않습니다.

코드

function solution(a, b) {
  var answer = 0;
  if (a <= b) {
    for (i = a; i <= b; i++) {
      answer += i;
    }
  } else if (a > b) {
    for (i = b; i <= a; i++) {
      answer += i;
    }
  }
  return answer;
}

작성 이유

a와 b의 대소관계가 정해져 있지 않으므로 'a가 클경우'와 'b가 클경우'로 나눠서 생각, 둘의 값이 같을 수도 있으므로 if나 else if 둘중 하나는 비교연산자 <=사용. a와 b사이 숫자를 합치면 되는 문제이므로 반복문을 사용해 합쳐줌.

콜라츠 추측

문제 설명

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이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

제한 사항

입력된 수, num은 1 이상 8,000,000 미만인 정수입니다.

코드

function solution(num) {
  var answer = 0;
  for (i = 0; i < 500; i++) {
    if (num != 1) {
      if (num % 2 === 0) {
        num = num / 2;
      } else {
        num = num * 3 + 1;
      }
    } else {
      return i;
    }
  }
  return -1;
}

작성 이유

500번 돌아가는 반복문을 만든 뒤, num값이 1이 아닌경우와 1인 경우로 계산, 조건에 맞게 값을 계산해준 후 500번 돌아가는 동안 결과가 나왔으면 i값을 리턴, 결과가 나오지 않았으면 -1을 리턴.

서울에서 김서방 찾기

문제 설명

String형 배열 seoul의 element중 "Kim"의 위치 x를 찾아, "김서방은 x에 있다"는 String을 반환하는 함수, solution을 완성하세요. seoul에 "Kim"은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한 사항

seoul은 길이 1 이상, 1000 이하인 배열입니다.
seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
"Kim"은 반드시 seoul 안에 포함되어 있습니다.

코드

function solution(seoul) {
  var x = 0;
  for (i = 0; i < seoul.length; i++) {
    if (seoul[i] === "Kim") {
      x = i;
    }
  }
  var answer = `김서방은 ${x}에 있다`;
  return answer;
}

작성 이유

seoul의 길이만큼 반복되는 반복문을 만들어 주고 seoul배열의 원소값이 Kim이면 i값을 반환. 처음에는 반복문 위에 answer을 작성했더니 answer안의 x값이 반복문을 거쳐 나온것이 아닌 선언해줫을때의 x값을 가져와서 순서를 바꿔줬다.

나누어 떨어지는 숫자 배열

문제 설명

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

제한사항

arr은 자연수를 담은 배열입니다.
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
divisor는 자연수입니다.
array는 길이 1 이상인 배열입니다.

코드

function solution(arr, divisor) {
  var answer = [];
  for (i = 0; i < arr.length; i++) {
    if (arr[i] % divisor === 0) {
      answer.push(arr[i]);
    }
  }
  answer.sort((a,b) => a - b);
  if (answer.length === 0) {
    answer.push(-1);
  }
  return answer;
}

작성 이유

arr을 divisor로 나눳을떄 나머지가 0인 값 = 출력되는 값, 이 출력되는 값을 push를 통해 answer에 집어넣어 주고 반복문 종료 후 answer을 오름차순 정렬해줌. 만약 answer에 값이 없을 경우 answer에 -1을 집어넣어줌.

0개의 댓글