🗃️javascript/코테 프레임 문제

1-5 최솟값 구하기 [Number.MAX_SAFE_INTEGER(내장 상수)]

하얀성 2023. 9. 16. 08:28

문제는 최솟값 구하기다.

아래처럼 정렬을 통해서 금방 구했다.

하지만 답은 다른 법을 제시하고 있다.

function solution(arr){
  arr.sort((a,b) => a-b)
  return arr[0]
}

let arr=[5, 7, 1, 3, 2, 9, 11];
console.log(solution(arr));

 

<답안>

1
2
3
4
5
6
7
8
9
10
function solution(arr){         
   let answer, min=Number.MAX_SAFE_INTEGER;
   for(let i=0; i<arr.length; i++){
        if(arr[i]<min) min=arr[i];
        }
        answer=min;
       return answer;
 
  }
 
cs
 
 
 

이 둘을 비교해보자. 

위는 정렬로. 아래는 반복으로 답을 풀어 냈다.

당연히 위가 더 알아보기 쉽다. 하지만 둘을 비교해보고, 기초를 닦아야 한다.

 

그리고 나서 MAX_SAFE_INTEGER 같은 내장 상수가 뭔지 알아보자

지금은 상관없지만 중,고급 문제에 가면 아주 잘보이는 것들이다.

 

물론 초기화는 배열의 처음 값인 arr[0]으로 해도 된다.


 

시간 복잡도: 반복 방법이 더 적게 걸림

정렬 방법: JavaScript의 배열 정렬은 평균적으로 O(n log n)의 시간 복잡도를 가집니다 (n은 배열의 길이).
반복 방법: 배열을 한 번만 순회하면 되므로 O(n)의 시간 복잡도를 가집니다.
따라서 큰 배열에 대해 반복 방법이 정렬 방법보다 더 빠를 수 있습니다.

공간 복잡도: 반복방법이 공간을 덜 먹음

정렬 방법: 추가적인 메모리를 필요로 할 수 있습니다, 특히 정렬 중에 임시 배열을 사용할 경우.
반복 방법: 상수 시간 복잡도, 즉 추가적인 메모리가 거의 필요하지 않습니다.
원래 배열의 변경:

방법 비교: 정렬은 기존 배열을 건듦, 반면 반복 방법은 기존 배열에 영향 x

 

정렬 방법: arr.sort()는 원래 배열을 변경합니다. 이는 원본 데이터를 변경하고 싶지 않은 경우 문제가 될 수 있습니다.
반복 방법: 원래 배열에 변경을 주지 않습니다.

 

자... 답이 보인다. 반복 방법을 쓰는게 더 좋은 코드라는 것이고. 나중을 위해 더 좋다는게.

 


Number.MAX_SAFE_INTEGER와 같은 값들은 JavaScript에서 "내장 객체" 또는 "내장 상수"라고 불립니다. JavaScript에는 여러 가지 유용한 내장 객체와 상수들이 있으며, 여기에 몇 가지 예를 들어보겠습니다:

Number 관련 상수:

Number.MAX_SAFE_INTEGER: 안전한 최대 정수 값 (9007199254740991).
Number.MIN_SAFE_INTEGER: 안전한 최소 정수 값 (-9007199254740991).
Number.MAX_VALUE: JavaScript에서 표현할 수 있는 최대 숫자 값.
Number.MIN_VALUE: JavaScript에서 표현할 수 있는 양수 중 최소 숫자 값 (0에 가깝지만 0은 아닙니다).
Number.POSITIVE_INFINITY: 양의 무한대를 표현하는 값.
Number.NEGATIVE_INFINITY: 음의 무한대를 표현하는 값.
Number.NaN: "Not-a-Number"를 표현하는 특별한 값.
Math 객체:

Math.PI: π (파이) 상수의 근사값.
Math.E: 자연 상수 e의 근사값.
Global 객체:

Infinity: 무한대를 표현하는 글로벌 객체.
NaN: "Not-a-Number"를 표현하는 글로벌 객체.
String 객체의 프로퍼티와 메서드:

String.prototype: String 객체의 프로토 타입, 여러 유용한 메서드를 포함하고 있습니다 (예: toUpperCase, toLowerCase, trim 등).
Array 객체의 프로퍼티와 메서드:

Array.prototype: Array 객체의 프로토 타입, 여러 유용한 메서드를 포함하고 있습니다 (예: push, pop, shift, unshift, splice 등).
이러한 내장 객체와 상수들은 JavaScript 코드를 작성하면서 자주 사용되며, 여러 가지 작업을 쉽고 효과적으로 수행할 수 있도록 도와줍니다.

 


<내장 상수의 사용 효과>

1. 변수를 초기화 하면서 미리 정보를 흘릴 수 있음

2. 보수적(안정빵)으로 초기화를 설정 하는것이라서 연산에 좀 더 문제가 없게 할 수 있음.

 

let answer = Number.MAX_SAFE_INTEGER;
console.log(answer)


24.4.10.

 

위에서 반복문이 더 좋다니 뭐니 되어있지만, 막상 시험이 되면 아! 하고 생각나서 사용될 수 있는게 아니다.

문제를 많이 풀어보면서 각 알고리즘 당 적응이 되는게 훨씬 낫다.

게다가 안타깝게도 개발을 쭉 하면서 코드를 살펴보니 대부분은 스프레드를 쓰는 방향이지 반복문을 스프레드를 버려가면서 까지 쓰지는 않는다는... 일단은 이렇게 풀고 넘어가겠다. (내가 봤을 때는 지금의 내겐 객체를 다루는 연습이 더 중요해보임)

function solution(arr) {
  let answer;
  answer = Math.min(...arr);
  return answer;
}
let arr = [5, 7, 1, 3, 2, 9, 11];
console.log(solution(arr));