본문 바로가기
개인공부/패스트캠퍼스 알고리즘

1-6. JavaScript 배열 문제풀이

by 뭉지야 2023. 7. 30.
728x90

<최소, 최대>
www.acmicpc.net/problem/10818

 

10818번: 최소, 최대

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

#포인트
-배열의 원소를 하나씩 확인하여, 최대값과 최소값을 찾는 문제다.
-최대값(max value)과 최소값(min value) 정보를 업데이트한다.

-원소를 차례대로 하나씩 확인한다는 점에서 시간 복잡도 O(N)로 해결할 수 있다.

 

# 정답예시1

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

let n = Number(input[0]);
let arr = input[1].split(' ').map(Number);

//모든 정수는 -1000000보다 크거나 같고, 1000000보다 작거나 같은 정수이다.
let minValue = 1000001; // 일단 큰 수로 초기화
let maxValue = -1000001; // 일단 작은 수로 초기화
for(let i = 0; i < n; i++){
  if(minValue > arr[i]) minValue = arr[i];
  if(maxValue < arr[i]) maxValue = arr[i];
}
console.log(minValue, maxValue);

# 정답예시2

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

let n = Number(input[0]);
let data = input[1].split(' ').map(x => Number(x));

let minValue = data.reduce((a,b)=> Math.min(a,b));
let maxValue = data.reduce((a,b)=> Math.max(a,b));

console.log(minValue + " " + maxValue);

<최댓값>
www.acmicpc.net/problem/2562

 

2562번: 최댓값

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어

www.acmicpc.net

 

#포인트
-배열의 원소를 하나씩 확인하여, 최댓값과 그 인덱스를 찾는 문제다.
-계속해서 가장 큰 값을 가지는 원소의 인덱스(index)를 업데이트한다.

-원소를 차례대로 하나씩 확인한다는 점에서 시간 복잡도 O(N)로 해결할 수 있다.

 

#정답예시

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

let maxIndex = 0;
let maxValue = 0;
for(let i=0; i<9; i++){ //모든 데이터를 하나씩 확인하며
  let data = Number(input[i]);
  if(maxValue < data){
    maxValue = data;
    maxIndex = i;
}
}
console.log(maxValue);
console.log(maxIndex + 1);

 

 


<나머지>
www.acmicpc.net/problem/3052

 

 

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

#포인트
-각 원소를 하나씩 확인하며, 42로 나눈 나머지를 차례대로 출력한다.
-원소를 하나씩 확인한다는 점에서 시간 복잡도는 O(N)이다.

-현재 출력할 값: 105 % 42 = 21
나머지 값들: [21]
집합: {21}


-현재 출력할 값: 302 % 42 = 8
나머지 값들: [21, 4, 8, 5, 35, 25, 8]
집합: {21, 4, 8, 5, 35, 25}

 

 

#정답 코드 예시

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

let data = input.map(Number);
let mySet = new Set();   //집합 객체 생성해서 원소를 추가해준다.

//원로를 하나씩 확인하며
for(let i=0; i< 10; i++){
  mySet.add(data[i] % 42);  //42로 나눈 나머지를 집합의 원소로 삽입
}

//집합에 포함된 원소의 개수 출력
console.log(mySet.size);

<평균은 넘겠지>

www.acmicpc.net/problem/4344

#포인트
1. 먼저 N개의 원소에 대한 평균 값을 계산한다. O(N)
2. 다시 N개의 원소를 하나씩 확인하여 평균 이상인지 확인한다. O(N)
-전체 시간 복잡도는 O(N)이다.

-계산된 평균 값: 52.143
-평균 이상인 값들: [71, 59, 82, 68]
따라서 평균을 넘는 학생의 비율은 4/7 = 57.143%이다.

 

#정답예시

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

let testCases = Number(input[0]);
for(let t=1; t<= testCases; t++){  //각각의 테스트 케이스를 확인
  let data = input[t].split(' ').map(Number);
  let n = data[0];  // 첫번째 수는 데이터의 개수
  let summary = 0;  // n개의 점수에 대하여 평균 계산
  for(let i=1; i<= n; i++){
    summary = summary + data[i]
}
let average = summary / n;
let cnt = 0; //점수가 평균을 넘는 학생 수 계산
for(let i=1; i<= n; i++)
  if(data[i] > average) cnt += 1;
//점수가 평균을 넘는 학생의 비율을 소수점 아래 셋째 자리까지 출력
console.log(`${(cnt / n * 100).toFixed(3)}%`);
}

<평균>

www.acmicpc.net/problem/1546

#내가푼코드

#포인트
-다음의 과정을 통해 시간 복잡도 O(N)으로 문제를 해결할 수 있다.
1. 가장 먼저, 최댓값을 계산한다.
2. 이후에 각 값을 하나씩 확인하여 새로운 값 X/M x 100을 계산하여 평균을 구한다.

- 최대값(M): 82

 

#정답예시

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

let n = Number(input[0]);
let scores = input[1].split(' ').map(Number);

let maxValue = scores.reduce((a,b)=> Math.max(a,b));
let updated = [];
for(let i=0; i<n; i++){  //수정된 원소 하나씩 저장
  updated.push(scores[i] / maxValue * 100);
}
//배열에 포함된 원소의 평균 출력
console.log(updated.reduce((a,b)=> a+b) / n);
728x90