Developer/JavaScript

자바스크립트 , 누적합구하기/ 최대값,최소값구하기 /거듭제곱구하기 원리

단님 2024. 5. 16. 23:21
728x90
누적합 구하기 원리

*현재 누적 합 = 과거 누적합 + 현재 대상값. ( K = K + N)

 

최초의 상황일 때 과거 누적합이 없기 때문에 최초 가상 누적합에 의미없는 수(0)를 넣어 선언.

누적합에 해당하는 변수선언 , 현대 대상값에 해당하는 변수 선언,

최초 가상 누적합에 초기화.가 필요함을 알수 있음.

 

'use strict';

// 1부터 10 까지의 누적합을 입력받아 출력해보자.

let tot =0 , min, max; //최초 가상 누적합

min= +prompt(`작은값 : `);
max= +prompt(`큰값 : `);

for (let i = min; i <= max; i++) {
    tot = tot + i ;
}

alert(`${min} 값 부터 ${max} 값의 누적합은 ${tot}`);

최소값을 최대값까지 반복하게 될것이고,

합계를 저장할 저장공간을 마련한다.

최초의 가상누적합이 존재하지 않기 때문에 0의 의미없는 수를 넣어서 선언.

시작 : 최소값 / 끝 : 최대값 / 시작값을 1씩증가하면서 더할거야.

재료준비가 완료되었다면  for문을 준비할 수 있다.

tot이라는 합계를 저장할 저장공간에 차곡차곡 최소값을 1씩 증가시키며 더하면 누적합을 구할 수 있다.

 

 

최대값, 최소값 구하기 원리

 

70 30 90 40 50 의 최대값 최소값을 구해보자.

우리 머리속에서 70과 30을 비교하고 , 다음 그 값과 90을 비교하는 순차적인 원리이다.

 

두가지 방법이 존재한다.

  • 범위가 확인 가능할 때 ( 최초 n 의 선언 )  0~100까지의 범위야 

-최초 가상 과거 최대값을 범위에서의 최소값. n = 0

처음 비교했을 때 최대값 현재 대상값이 되어야만 하기 때문에 현재 대상값(70) 보다 작아야함.

-최초 가상 과거 최소값을 범위에서의 최대값. n = 100

  • 처음이나 마지막 요소가 확인 가능할 때

최초 가상 과거 최대값 또는 최소값이 처음 요소.

n=70

 

따라서 범위가 확인가능할때는 범위를 지정하여 최초 가상 과거 값을 한번 더 지정하기 때문에

처음이나 마지막 요소가 확인 가능할 때 보다 비교를 1회 더 하게 됨을 알 수 있다

 

-범위가 확인 가능할 때

//최대값, 최소값 구하기
// 점수가 0점부터 100점 사이.
let max = 0, min = 100,
    sc;

    for (let i = 0; i < 5; i++) {
        sc = +prompt(`${i+1} 번째 학생 점수 :`);

        if (sc > max) {
            max = sc;
        }
        
        if (sc < min) {
            min = sc;
        }
    }
    alert(`최대값 ${max} ,최소값 ${min}  `);

 

-범위를 알 수 없을때

'use strict';

//최대값, 최소값 구하기
// 범위를 알 수 없을 때 처음 값을 최대값과 최소값을 넣고 1회 적게 반복.
let max,min,
    sc;

    min = max = +prompt(`1번째 학생 점수 :`);
    for (let i = 1; i < 5; i++) {
        sc = +prompt(`${i+1} 번째 학생 점수 :`);

        if (sc > max) {
            max = sc;
        }
        
        if (sc < min) {
            min = sc;
        }
    }
    alert(`최대값 ${max} ,최소값 ${min}  `);

 

메서드함를 통한 쉬운 방법.

'use strict';
// 메서드 함수로 최대값 최소값 찾기.
//최대값, 최소값 구하기
// 범위를 알 수 없을 때 처음 값을 최대값과 최소값을 넣고 1회 적게 반복.
let max,min,
    sc;

    min = max = +prompt(`1번째 학생 점수 :`);
    for (let i = 1; i < 5; i++) {
        sc = +prompt(`${i+1} 번째 학생 점수 :`);

        max = Math.max(sc, max); 
        min = Math.min(sc, min);
    }
    alert(`최대값 ${max} ,최소값 ${min}  `);

 

Math,max() 는 내부의 가장 큰 요소를 저장하게됨.

console.log.(Math.max(70, 30, 15, 20, 78));

Math,min() 는 내부의 가장 큰 요소를 저장하게됨.

console.log.(Math.min(70, 30, 15, 20, 78));

 

 

거듭제곱 구하는 원리

 

 

거듭제곱도 순차적으로 계산하는 누적합 구하는 원리와 같다.

아래 예제를 통해 살펴보겠다.

//밑수 , 지수 // 밑수 의 지수 승은 ? //음수 입력일 경우 앞으로 재입력 구현. //입력값이 1이상.

 

'use strict';

let num,sub ,result ;

while(1){
num = +prompt(`밑수 :`);

if (num<0) {
    alert(`음수가 입력되었습니다. 재입력 바랍니다.`); continue;
}

sub = +prompt(`지수 :`);

if (sub<0) {
    alert(`음수가 입력되었습니다. 재입력 바랍니다.`); continue;
}

result = num ; // 2 
for (let i = 1; i < sub; i++) {
    result = result * num; 
}
alert(`${num}의 ${sub}승은 ${result}입니다`); break;
}

추후에 이 예제는 다시 다뤄보겠다.

코드의 간결화가 가능하다는것을 추후에 알게 되었는데 ,

가장 중요하게 생각할 것은 먼저 걸러내 처리할것과 ,

공통적인 부분을 어떻게 묶어나갈것인가에 대한 고민이 필요하다는 것이다.

 

아직은 나의 견해가 짧고 세상에 무궁무진한 방법들에 매번 놀라고 있다.

많은 코드들을 보고 이해하다 보면 , 나도 언젠가 생각의 폭이 넓어지지 않을까?