2022. 6. 22. 01:23ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/2822
2822번: 점수 계산
8개 줄에 걸쳐서 각 문제에 대한 참가자의 점수가 주어진다. 점수는 0보다 크거나 같고, 150보다 작거나 같다. 모든 문제에 대한 점수는 서로 다르다. 입력으로 주어지는 순서대로 1번 문제, 2번 문
www.acmicpc.net
접근 방법 - 최댓값 연산과 정렬의 혼합 문제
백준의 2822번 문제는 최댓값 연산과 정렬 연산을 함께 사용하여 해결해야하는 문제이다.
해당 문제는, 입력받은 8과목의 성적 중 가장 높은 점수인 5과목만 추려 이들의 합과 5과목의 숫자들을 순차적으로 출력해야하는 문제이다.
필자는 이중 반복문을 통해 원시적으로 최댓값 연산을 수행하여 높은 성적의 5과목을 추려보았다.
그리고 정렬 함수를 이용하여 5과목 숫자들을 오름차순으로 나열한 뒤 올바르게 출력하게끔 하였다.
필자는 정렬에 큰 비중을 두지 않고 코드를 작성해선지 사실 정렬 문제인지는 여전히 잘 모르겠다고 하더라
자세한 내용은 아래의 코드와 설명을 참고하길 바란다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 8과목의 성적들(score)을 입력받는다.
2) 5과목 점수들의 합계를 저장할 변수 sum을 0으로 초기화하여 선언한다.
또한, 5과목의 숫자들을 저장할 배열 cnt를 선언한다.
3) 반복문을 작성하여 아래의 연산을 취한다.
- 8과목 중 가장 높은 점수부터 시작하여 5과목을 추려내본다. 이때, 해당 과목의 숫자도 별도로 함께 저장하도록 한다.
- 한 과목씩 추려내는대로, sum에 해당 과목의 점수를 더하고 과목의 숫자를 cnt에 저장한다.
또한, score에 저장된 해당 과목의 점수를 0으로 변경하여 다음 최댓값 연산을 원활하게끔 한다.
4) 3)의 반복문이 끝났다면, cnt에 있는 과목의 숫자들을 오름차순으로 정렬한다.
5) sum에 저장된 값과 cnt의 값들을 순차적으로 출력하도록 한다.
(이때 배열 번호의 값을 그대로 저장했기 때문에, cnt에는 원래 과목 숫자들에 1씩 뺄셈된 값으로 저장되었을 것이다.
따라서, 과목 숫자들을 출력할 시 cnt의 값들에 1씩 더하여 출력하도록 한다.)
6) 출력이 모두 끝났다면, 실행 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <algorithm>
#define endl '\n'
using namespace std;
//백준 2822번 코드
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int score[8];
for (int i = 0; i < 8; i++) {
cin >> score[i];
}
int sum = 0;
int cnt[5];
for (int i = 0; i < 5; i++) {
int max = 0;
int max_;
for (int j = 0; j < 8; j++) {
if (max < score[j]) {
max_ = j;
max = score[j];
}
}
sum += max;
cnt[i] = max_;
score[max_] = 0;
}
sort(cnt, cnt + 5);
cout << sum << endl;
for (int i = 0; i < 5; i++) {
cout << cnt[i] + 1 << " ";
}
cout << endl;
}
제출 결과
(2022.05.06 백준 2822번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 11721번 열 개씩 끊어 출력하기 (C++/cpp) (0) | 2022.06.27 |
---|---|
[백준 BOJ] 10817번 세 수 (C++/cpp) (0) | 2022.06.22 |
[백준 BOJ] 9316번 Hello Judge (C++/cpp) (0) | 2022.06.21 |
[백준 BOJ] 1550번 16진수 (C++/cpp) (0) | 2022.06.21 |
[백준 BOJ] 1748번 수 이어 쓰기 1 (C++/cpp) (0) | 2022.06.19 |