TIL. 알고리즘 문제풀이

seul_velog·2022년 4월 5일
0

TIL_algorithm

목록 보기
2/26
post-custom-banner

1. 홀수

문제 설명

7개의 자연수가 주어질 때, 이들 중 홀수인 자연수들을 모두 골라 그 합을 구하고, 고른 홀수들 중 최솟값을 찾기.

예를 들어, 7개의 자연수 12, 77, 38, 41, 53, 92, 85 가 주어지면
홀수는 77, 41, 53, 85 이므로
합은 77+41+53+85 = 256 이다.

각 홀수마다 크기의 순서는
41 < 53 < 77 < 85 이므로 41이 최솟값이다.

따라서 256과 41이 출력 되어야 한다.

입출력 예

inputoutput
[12, 77, 38, 41, 53, 92, 85][256,41]

풀이

const smallestOdd = (arr) => {
  let oddArr = [];

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] % 2 !== 0) {
      oddArr.push(arr[i]);
    }
  }
  // 홀수 총합
  const sumOdd = oddArr.reduce((a, b) => a + b, 0);
  console.log(sumOdd);

  // 가장 작은 홀수
  const minOdd = Math.min(...oddArr);
  console.log(minOdd);

  return `홀수의 합:${sumOdd}, 가장 작은 홀수:${minOdd}`;
};

✍️

  • oddArr에 빈 배열을 선언하고 for을 통해서 이곳에 홀수만 push한다.
  • 그 후 이 배열을 이용, 홀수 총합과 가장 작은 홀수를 찾는다.
  • 홀수의 총합은 reduce를 이용한다.
  • 홀수의 최솟값은 Math.min 을 이용한다. 여기서 스프레드 문법이 아닌 oddArr 만 넣으면 콘솔창에 NaN만 출력되어서 비교해 보았다.
    console.log(oddArr);
     console.log(...oddArr);
  • Math.min() 함수는 주어진 숫자들 중 가장 작은 값을 반환한다. 주어진 숫자들 중 가장 작은 값. 만약 적어도 1개 이상의 인자값이 숫자형으로 변환이 불가능 한 경우 이 함수는 NaN 를 반환 한다.
  • ❓ 처음엔 주어진 배열의 안을 살펴보면 전부 멀쩡한 숫자인데 왜 NaN이 떴을까 🤔 생각했는데 당연하게도 콘솔창에 찍어본 것을 보면 oddArr만 넣을 경우 배열을 바라보기 때문에 NaN가 뜬 것이라고 이해했다.

    function add(a,b,c){
      return a+b+c
    }
    
    const nums = [1,2,3]
    console.log(add(nums)) // 1,2,3 undefined undefined
    console.log(add(...nums)) // 6

    MDN_Math.min() 예제 살펴보기 ▼

    console.log(Math.min(2, 3, 1));
    // expected output: 1
    
    console.log(Math.min(-2, -3, -1));
    // expected output: -3
    
    const array1 = [2, 3, 1];
    
    console.log(Math.min(...array1));
    // expected output: 1
    • array1 배열은 스프레드 연산자를 사용해서 Math.min() 안에 넣어준 것을 확인!

solution

function solution(arr) {
  let answer = [];
  let sum = 0, min = Number.MAX_SAFE_INTEGER;
  for (let x of arr) {
    if (x % 2 === 1) {
      sum += x;
      if (x < min) min = x;
    }
  }
  answer.push(sum);
  answer.push(min);
  return answer;
}

console.log(solution(arr)); // [256, 41]

✍️

  • answer 변수에 빈 배열을 할당, 이후 값을 각각push 하는 방법으로 작성한다.
  • sum과 min변수를 동시에 let 키워드로 선언한다.
  • for...of 를 이용해서 홀수를 찾아내고, 그 후 x에 담은 모든 홀수의 합과 가장 작은 홀수를 찾아낸다.
  • 각각의 답을 answer에 push해 주고 return한다. 이 방법이 훨씬 간단하고 효율적이라고 생각했다.
  • Number.MAX_SAFE_INTEGER : 상수Number.MAX_SAFE_INTEGER 는 JavaScript에서 안전한 최대 정수값을 나타낸다. -MDN






2. 문자 찾기

문제 설명

한 개의 문자열을 입력받고, 특정 문자를 입력받아 해당 특정문자가 입력받은 문자열에 몇 개 존재하는지 알아내기.

문자열의 길이는 100을 넘지 않는다.

입력설명: 첫 줄에 문자열이 주어지고, 두 번째 줄에 문자가 주어진다.
출력설명: 첫 줄에 해당 문자의 개수를 출력한다.

입출력 예

inputoutput
COMPUTERPROGRAMMING, R3

풀이

const chcrInStr = (str, char) => {
  let charArray = [];

  for (let x of str) {
    if (x === char) {
      charArray.push(x);
    }
  }
  console.log(charArray);
  return charArray.length;
};

const str = 'COMPUTERPROGRAMMING';
const char = 'R';
console.log(chcrInStr(str, char));

✍️

  • for...of 문을 사용해서 속성값을 x에 할당 한 뒤, if 문을 통해서 char을 찾는다.
  • charArray 배열에 해당 문자만 담고 그 길이를 반환한다.

solution

1) for...of

function solution1(s, t) {
  let answer = 0;

  for (let x of s) {
    if (x === t) answer++;
  }
  return answer;
}

let str1 = 'COMPUTERPROGRAMMING';
console.log('solution1 :', solution1(str1, 'R'));

✍️ answer 을 선언, 초기화하고 마찬가지로 for..of 문과 if 문을 통해서 s 안의 특정 문자 t 를 찾은 뒤 answer 값을 ++ 해준다.


2) 내장함수 split 사용

function solution2(s, t) {
  let answer = s.split(t).length - 1;
  return answer;
}

let str2 = 'COMPUTERPROGRAMMING';
console.log('solution2 :', solution2(str2, 'R'));

✍️

  • split 을 사용한다. 구분자로 들어온 문자 t 를 넣는다.
  • t 문자가 구분자가 되어 문자열이 나뉜다. 따라서 문자열이 나뉘어 들어간 배열의 길이에서 -1 해주면, 해당 구분자 역할의 t 가 들어온 개수를 구할 수 있다.
  • ❓ 만약 끝부분에 t에 해당하는 문자('R' 이 있다면 length -1을 해도 값이 맞을까? 🤔
    ❗️ 끝에 R이 있어도 맨 마지막 자리를 빈문자열로 구분하기때문에 length-1 처리해도 값이 잘 나온다.
    let str2 = 'COMPUTERPROGRAMMINGR';




reference)
자바스크립트 알고리즘 문제풀이

profile
기억보단 기록을 ✨
post-custom-banner

0개의 댓글