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

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

알고리즘 문제 풀어보기

수박수박수박수박수박수?

문제 설명

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

제한 조건

n은 길이 10,000이하인 자연수입니다.

작성 코드

function solution(n) {
  var answer = "";
  var subak = "";
  for (i = 1; i < n + 1; i++) {
    if (i % 2 === 0) {
      subak = "박";
    } else {
      subak = "수";
    }
    answer += subak;
  }
  return answer;
}

풀이 방식

n과 같을때까지 돌아가는 반복문 생성, i값이 짝수일때, "박"을 반환하고 홀수일때 "수"를 반환하는 조건문생성, 해당값들을 합쳐서 리턴.

내적

문제 설명

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]b[0] + a[1]b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)

제한사항

a, b의 길이는 1 이상 1,000 이하입니다.
a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

작성 코드

function solution(a, b) {
  var answer = 0;
  var abr = 0;
  for (i = 0; i < a.length; i++) {
    abr = a[i] * b[i];
    answer += abr;
  }
  return answer;
}

풀이 방식

같은 길이의 배열의 같은 위치에 있는 값을 곱한 후 모두 더해주면 되므로 반복문의 a.length부분은 b가 되도 상관없음. 두 배열의 값을 곱해서 변수에 넣어주고, 변수 값을 모두 더한 후 리턴하면 됨.

약수의 개수와 덧셈

문제 설명

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

1 ≤ left ≤ right ≤ 1,000

작성 코드

function solution(left, right) {
  var answer = 0;
  for (i = left; i <= right; i++) {
    var x = 0;
    for (a = 1; a <= i; a++) {
      if (i % a == 0) {
        x++;
      }
    }
    if (x % 2 == 0) {
      answer += i;
    } else {
      answer -= i;
    }
  }
  return answer;
}

풀이 방식

left와 right의 사이값을 구하기 위해 반복문 사용, 약수를 찾기위해 i만큼 반복하는 반복문을 처음 반복문안에서 이중반복문으로 만들어주고 i를 a로 나눳을때 나머지가 0이면 x값을 +1 해줌. => 약수의 개수
다시 처음 반복문으로 나와서 위의 x값이 2로 나눳을 때 나머지가 0이면(짝수이면) answer값에 i값을 더해주고 아니라면 i값을 빼줌.

문자열 내림차순으로 배치하기

문제 설명

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

제한 사항

str은 길이 1 이상인 문자열입니다.

작성 코드

function solution(s) {
  var answer = "";
  answer = s.split("").sort().reverse().join("");
  return answer;
}

풀이 방식

split으로 배열로 쪼갬. -> sort로 오름차순 -> reverse로 나열된 값을 반전 -> join으로 문자열로 다시 바꿈

부족한 금액 계산하기

문제 설명

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한사항

놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

작성 코드

function solution(price, money, count) {
  var answer = 0;
  var moprice = 0;
  for (i = 0; i <= count; i++) {
    moprice += price * i;
  }
  if (money < moprice) {
    answer = moprice - money;
  } else {
    answer = 0;
  }
  return answer;
}

풀이 방식

count의 값만큼 회전하는 반복문을 통해 필요 이용금액을 구해주고 해당값이 가진돈보다 많다면 필요 이용금액 - 가진돈을 반환, 아니라면 0을 반환.

개인 과제 - CH 2 Rogue like JAVASCRIPT!

Math.random()
0 이상과 1 미만의 수를 무작위로 생성하는 함수
0~0.9999...이므로 정수가 아닌 실수값이므로 Math.floor(), Math.ceil(), Math.round()를 통해 각각 내림, 올림, 반올림을 할 수 있다.

ex)
    //0 ~ 10 까지 
    let random1 = Math.floor(Math.random()*11);
    document.write("0 ~ 10 까지 : "+random1+"<br>");
    
    //0 ~ 100 까지 
    let random2 = Math.floor(Math.random()*101);
    document.write("0 ~ 100 까지 : "+random2+"<br>");
    
    //55 ~ 555 까지 
    let random3 = Math.floor(Math.random()*501)+55;
    document.write("55 ~ 555 까지 : "+random3+"<br>");
function rand(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

해당 방식을 통해 최대값 ~ 최소값인 난수를 만들 수 있음!

random을 이용해 스테이지가 올라갈 때마다 플레이어의 체력, 공격력, 몬스터의 체력, 공격력을 변화시키려고 진행하는 과정중에 원래 잘 받아오던 stage 값을 받아오지 못하는 문제가 발생했다.. 내일은 이부분을 해결하고 필수구현을 마무리 해봐야겠다.

(몬스터의 hp값을 스테이지값+a로 하려했는데 NaN이 뜬다..)

0개의 댓글