[백준 BOJ] 23278번 영화 평가 (C++/cpp)

2022. 12. 15. 17:16PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/23278

 

23278번: 영화 평가

스타트링크에는 영화 감상 동아리가 있다. 영화 동아리에는 총 N명의 구성원이 있고, 매주 모여서 영화 한 편을 본다. 영화를 본 뒤, 각 사람은 0보다 크거나 같고, 100보다 작거나 같은 정수로 영

www.acmicpc.net

백준 BOJ 23278번 영화 평가 문제 사진1
백준 BOJ 23278번 영화 평가 문제 사진2

 

접근 방법 - 정렬을 응용한 사칙연산 문제

백준의 23278번 문제는 정렬을 함께 사용하여 해결해야 하는 사칙연산 문제이다.

해당 문제는, 주어진 평가들에 대하여 가장 높은 평가와 가장 낮은 평가 몇 개를 제외한 평점들의 평균을 구해야 하는 문제이다.

정렬 함수 sort()를 능숙히 사용할 줄 알고 사칙연산 알고리즘에 대해 어느 정도 설계해보았다면 그럭저럭 쉽게 풀 수 있는 문제일 것이다.

다만 예제 출력을 확인해보면 알겠지만, 결괏값을 소수점까지 출력해야 하기 때문에 이 점은 꼭 유의하며 문제를 해결해야 할 것이다.

혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 3개의 값(n, l, h)을 우선 입력받는다.

 

2) 입력값으로 주어지는 평가 점수들을 저장할 배열 arr를 미리 선언해둔다.

뒤이어, 평균 연산에 필요한 합계의 값을 저장할 변수 sum을 0으로 초기화하여 미리 선언해둔다.

이때, 최종 결괏값이 소수점으로 나타나야 하기 때문에 둘 다 double형으로 선언하도록 한다.

 

3) n의 크기만큼, 반복문을 실행하여 아래의 연산을 취한다.

- arr의 값을 하나씩 입력받는다.

- arr의 값을 입력받는 대로, 해당 값을 sum에 더하도록 한다.

 

4) sort() 함수를 이용하여, arr의 배열값들을 오름차순으로 정렬한다.

 

5) sum에 대하여, 연산에 필요 없는 평가 점수들은 각각 빼도록 한다.

(첫 번째 반복문은 l개의 최소 평가값을 빼는 연산이며, 두 번째 반복문은 h개의 최대 평가값을 빼는 연산이다.)

 

6) 연산이 완료된 sum에 대해, 해당 sum에 포함된 평가의 개수만큼 나누어 최종 평균값을 출력한 뒤, 실행 종료한다.

(여기서, 평균이 double형으로 나와야 하기 때문에 연산 결과에 대해 double형으로 강제 형변환하여 출력하도록 한다.)

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <algorithm>
#define endl '\n'
using namespace std;

//백준 23278번 코드
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);
	cout.precision(10);

	int n, l, h;
	cin >> n >> l >> h;
	double arr[51];
	double sum = 0;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
		sum += arr[i];
	}

	sort(arr, arr + n);
	for (int i = 0; i < l; i++) {
		sum -= arr[i];
	}
	for (int i = 0; i < h; i++) {
		sum -= arr[n - i - 1];
	}
	cout << (double)(sum / (n - l - h)) << endl;
}

 

제출 결과

백준 BOJ 23278번 영화 평가 문제 C++ 제출 결과

(2022.06.12 백준 23278번 문제 제출 결과)

반응형