[알고리즘] 세 수 중 최솟값

soheeoott·2021년 4월 29일
0

알고리즘

목록 보기
1/9
post-thumbnail

100 이하의 자연수 A, B, C 중 가장 작은 값(최솟값)을 출력

switch 문을 사용

function solution(a, b, c) {
  let answer = 0;
  switch (a < b) {
    case true:
      answer = a;
      switch (answer < c) {
        case true:
          return answer;

        case false:
          answer = c;
          return answer;
      }

    case false:
      answer = b;
      switch (answer < c) {
        case true:
          return answer;

        case false:
          answer = c;
          return answer;
      }
  }
}
console.log(solution(11, 9, 13));

📖 문제 풀이 과정

평소에 잘 사용하지 않았던 switch 조건문을 사용하여 풀이하였다.

solution(11, 9, 13)
함수를 호출함과 동시에 인자값으로 11, 9, 13을
solution 함수의 매개변수 값으로 전달한다.

let answer = 0;
결과값으로 반환 return 할 변수 answer의 초기 값을
매개변수 a, b, c 와 무관한 값으로 설정한다.
a, b, c 중 하나를 초기값으로 설정해도 된다.

case true:

switch (a < b)
b 가 a 보다 크다면 조건문이 참이므로 case 문 true 가 동작하고,
a 값이 더 작은 값이므로 결과값을 담는 변수에 a 를 담고 다시 c 와 비교한다.
switch (answer < c)

  • case true:

    c 가 a 값을 담은 answer 변수보다 크다면
    a 값이 더 작기 때문에 그대로 answer 변수를
    함수의 결과값으로 반환해준다.

  • case false:

    answer 변수에 담겨진 a 값이 c 보다 크다면
    c 의 값이 더 작기 때문에 answer 변수에
    c 의 값을 담아주고 함수의 결과값으로 반환해준다.

case false:

switch (a < b)
a 가 b 보다 크다면 조건문이 거짓이므로 case 문 false가 동작하고,
b 값이 더 작은 값이므로 결과값을 담는 변수에 b 를 담고 다시 c 와 비교한다.
switch (answer < c)

  • case true:

    c 가 b 값을 담은 answer 변수보다 크다면
    b 의 값이 더 작기 때문에 그대로 answer 변수를
    함수의 결과값으로 반환해준다.

  • case false:

    answer 변수에 담겨진 b 값이 c 보다 크다면
    c 의 값이 더 작기 때문에 answer 변수에
    c 의 값을 담아주고 함수의 결과값으로 반환해준다.

이 풀이 방법은 C 언어로 switch case 값을 0, 1로 사용한 예제를 참고하였는데,
자바스크립트에서는 switch case 값을 0(false) 과 1(true)로 사용했더니
undefined 가 출력되었다.


내장 객체 Math.min()를 사용

function solution(a, b, c){
  let answer = Math.min(a, b, c);
  return answer;
}
console.log(solution(11, 9, 13));

📖 문제 풀이 과정

solution(11, 9, 13)
자연수 a, b, c의 값 11, 9, 13 을 solution 함수 호출과 동시에
함수의 인자값으로 전달한다.

Math.min(a, b, c)
전달 된 인자는 solution 함수의 매개변수 값이 되고,
내장 객체인 Math.min() 함수안에 매개변수
a, b, c 을 인자값으로 넣어주면
인자로 받은 값들 중 가장 작은 값을 반환한다.

let answer = Math.min(a, b, c);
내장 객체를 통해 반환 된 가장 작은 값을 변수 answer에 넣어
solution 함수의 결과값으로 반환 return 하면,

solution(11, 9, 13)
함수가 반환한 결과값은 9 이므로 출력결과는 9가 된다.

인자는 함수를 호출할 때 어떠한 값을 전달하는 값,
매개변수는 전달 된 인자값을 함수안에서 변수로 사용하는 값이다.

자바에서 Math.min 을 사용한 경험이 있었는데,
자바스크립트에서는 2개 이상을 인자값으로 넣어도 되지만,
자바에서는 두 개의 인자값을 받는다.


배열을 이용하여 최소값 구하기

function solution(a, b, c){
  let number = [];
  number.push(a, b, c);

  let answer = Math.min(...number);
  return answer;
}
console.log(solution(11, 9, 13));

📖 문제 풀이 과정

solution(a, b, c)
인자로 받아온 매개변수의 값을

let number = [];
number.push(a, b, c)
빈 배열 number에 넣는다.

내장 객체 Math.min 함수는 배열이 아닌 숫자값을 인자로 받는다.
ES6 문법 spead 연산자(전개 구문, 펼침 연산자) ...
배열, 문자열, 객체의 값을 분리하기 때문에
let answer = Math.min(...number);
(...[배열이름]) 로 인자값을 넣어 최소값을 구할 수 있다.

출처 : https://paperblock.tistory.com/62

Math 함수에 apply 메서드를 사용하면
숫자로 이루어진 배열을 인자로 전달할 수 있다.
하지만, 배열 안에 비교 할 수 없는 값이 있다면
결과 값은 숫자가 아닌 nan 을 갖는다.
배열의 크기가 큰 경우 Maximum call stack size exceeded
오류가 발생하므로 배열의 크기가 크지 않은 경우에 사용한다.

출처 : https://programmingsummaries.tistory.com/108


숫자를 랜덤으로 받아 최소값 구하기

function solution(num){
  let answer = Math.min(...num);
  return answer;
}

let random = [];
for(let i=0; i < 3; i++){
  let n = Math.floor(Math.random()*100)+1;
  random.push(n);
}
console.log(solution(random));

📖 문제 풀이 과정

solution(random)
solution 함수의 인자값으로 random 배열을 받는데,
이 때 random 배열의 값은 함수를 호출하기 전에 만들어진다.

랜덤으로 생성되는 값은 for 반복문을 통해 배열안에 위치하게 된다.
let i=0
i 변수는 반복문의 수행 횟수를 의미하는 변수로
i 가 0 의 값으로 반복문을 시작하면서 i++ 로 인해 i 의 값이 증가하다가
i 의 값이 3 이 되면 이 반복문은 종료되므로,
배열 [0, 1, 2] 인덱스에 랜덤으로 생성된 3 개의 수가 위치하게 된다.

let answer = Math.min(...num);
내장 객체 함수 Math.min의 인자값은
객체, 문자열, 배열을 직접 넣어줄 수 없기 때문에,
spead 문법 ... 을 사용한다.

랜덤으로 받아오는 숫자의 중복값 제거

function solution(arr){
  let answer = Math.min(...arr);
  return answer;
}

let randomArr = [];
for(let i=0; i < 3; i++){
  let randomNum = Math.floor(Math.random()*100)+1;
  if (randomArr.indexOf(randomNum) === -1) {
    randomArr.push(randomNum);
  } else { 
    i--;
  }
}
console.log(solution(randomArr));

📖 문제 풀이 과정

숫자를 랜덤으로 받아 최소값을 구하는 방법은
배열에 중복값이 저장되는 문제가 있다.

배열안에 있는 값 randomArr과 랜덤으로 생성되는 값 randomNum
같은지 비교하면 이 문제를 해결할 수 있다.

배열에서 중복되는 숫자를 찾기 위해 indexOf 메소드를 사용한다.
indexOf 는 메소드 안에 찾는 값을 인자로 받는다.

if (randomArr.indexOf(randomNum) === -1)
찾는 값이 없다면 -1 반환하기 때문에,

randomArr.push(randomNum);
이는 중복값이 없다는 의미이므로 배열에 랜덤으로 생성되는 값을 넣어준다.

i--;
중복값이 있는 경우 배열안에 값을 다시 넣어주어야 하므로
순환을 도는 i 의 값을 감소시킨다.

profile
📚 글쓰는 습관 들이기 📚

0개의 댓글