<최소, 최대>
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);
'개인공부 > 패스트캠퍼스 알고리즘' 카테고리의 다른 글
[알고리즘] 2-1. 자료구조 (0) | 2023.08.15 |
---|---|
1-7. JavaScript 문자열 문제풀이 (0) | 2023.08.01 |
1강-5. 반복문 문제풀이 (0) | 2023.07.28 |
1강-4. 조건문 문제풀이 (0) | 2023.06.29 |
1강-3. 입출력 문제풀이 (0) | 2023.06.28 |