인트로
정렬을 사용하는 기초적인 문제이다.
3등의 성적은?
문제
N명의 수학 성적이 주어지면 그중 3등을 한 수학 성적을 출력하는 프로그램을 작성하세요.
만약 학생의 점수가 100점이 3명, 99점이 2명, 98점이 5명, 97점이 3명 이런 식으로 점수가 분포되면 1등은 3명이며, 2등은 2명이며 3등은 5명이 되어 98점이 3등을 한 점수가 됩니다.
※ 입력 설명
첫 번째 줄에 자연수 N(1<=N<=100)이 주어집니다.
두 번째 줄에 N개의 수학 성적 점수가 공백을 사이에 두고 입력됩니다.
수학 성적 점수는 100점 만점 기준으로 입력됩니다.
※ 출력 설명
3등을 한 점수를 출력합니다.
입력
7
80 96 75 82 96 92 100
출력
92
코드 설명
선택 정렬을 이용해서 풀었다.
내림차순으로 정렬 후 3등을 찾아야 하는데 중복인 점수가 존재해서 2번 인덱스에 3등의 점수가 있다는 보장이 없다.
결국 3등을 찾기 위해 중복이 아닌 값이 두 번 나올 때까지 for문을 돌며 벡터를 한 번 더 검사했다.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, i, j, minIdx, tmp, count = 0;
cin >> n;
vector<int> v(n);
for (i = 0; i < n; i++)
cin >> v[i];
/*Selection Sort Begin*/
for (i = 0; i < n - 1; i++)
{
minIdx = i;
for (j = i + 1; j < n; j++)
{
if (v[minIdx] < v[j])
minIdx = j;
}
tmp = v[minIdx];
v[minIdx] = v[i];
v[i] = tmp;
}
/*Selection Sort End*/
for (int i = 0; i < n - 1; i++)
{
if (v[i] != v[i + 1])
count++;
if (count == 2)
{
cout << v[i + 1];
break;
}
}
}
2021.11.12 업데이트
정렬해서 unique 때리고 두 번째 원소 가져오면 3등의 성적이다.
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int n, score;
vector<int> v;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> score;
v.push_back(score);
}
sort(v.begin(), v.end(), greater<int>());
v.erase(unique(v.begin(), v.end()), v.end());
cout << v[2];
return 0;
}
'Algorithm > it 취업을 위한 알고리즘 문제 풀이' 카테고리의 다른 글
[Algorithm] 37. Least Recently Used(카카오 캐시 문제 변형) (0) | 2021.08.20 |
---|---|
[Algorithm] 35. Special Sort(구글 인터뷰) (0) | 2021.08.19 |
[Algorithm] 31. 탄화수소 질량 (0) | 2021.08.13 |
[Algorithm] 29. 3의 개수는?(small) (0) | 2021.08.12 |
[Algorithm] 28. N!에서 0의 개수 (0) | 2021.08.11 |