문제 설명
민준이는 뒤늦게 정보 과목의 중요성을 깨닫고 학습실에서 공부를 하고 있다.
기본 공부가 너무 안 되어 있어 아주 쉬운 문제부터 어려움을 겪은 민준이는 친구에게 물어보려고 한다.
가장 잘 하는 친구에게 물어보기는 질문의 내용이 너무 부끄러워 n명의 친구들 중 정보 성적이 3번째로 높은 친구에게 묻고자 한다.
친구들의 성적은 모두 다르다.
n명의 친구들의 이름과 정보 성적이 주어졌을 때 성적이 세 번째로 높은 학생의 이름을 출력하시오.
입력
첫째 줄에 n이 입력된다. ( 3 <= n <= 50 )
둘째 줄 부터 n+1행까지 친구의 이름과 점수가 공백으로 분리되어 입력된다. 이름은 영문
출력
세 번째로 높은 학생의 이름을 출력한다.
입력 예시
5
minsu 78
gunho 64
sumin 84
jiwon 96
woosung 55
출력 예시
minsu
<내 소스>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int n;
string arr[50][2] = { "0" };
int scoreArr[50];
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i][0] >> arr[i][1];
scoreArr[i] = stoi(arr[i][1]);
}
sort(scoreArr, scoreArr + n);
for (int i = 0; i < n; i++) {
if (scoreArr[n-3] == stoi(arr[i][1]))
cout << arr[i][0];
}
}
<다른 사람의 소스>
#include <stdio.h>
int main()
{
int n, i, j;
char name[55][22];
int score[55], rank[55];
scanf("%d", &n);
for(i=1; i<=n; i++)
{
scanf("%s", name[i]);
scanf("%d", &score[i]);
rank[i]=1;
}
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(score[i] < score[j])
rank[i]++;
for(i=1; i<=n; i++)
if(rank[i]==3)
printf("%s", name[i]);
return 0;
}
나는 algorithm의 정렬함수인 sort()를 사용해서 3등을 찾는데 썼다.
그런데 다른 사람의 풀이를 보니, 내가 생각지도 못한 등수를 찾는 알고리즘이었다.
예를 들어, 첫번째 점수가 몇등인지 알고싶으면, 다른 점수들과 비교해서 첫번째 점수가 작으면 rank를 1씩 더해준다.
그렇게 반복하다 보면 그럼 결국 제일 큰수는 더해지지 않으므로, 처음에 초기화한 1에서 그대로인 rank 1 이된다.
역시 알고리즘을 잘짜면 코드가 간결해지고 쉬워지는것 같다.
생각하는 힘을 길러야겠다.
'PS > CodeUp' 카테고리의 다른 글
CodeUp / 1차원 배열 / 1430번 / 기억력 테스트2 / C++ (0) | 2020.10.03 |
---|---|
CodeUp / 1차원 배열 / 1425번 / 자리 배치 / C++ (0) | 2020.10.03 |
CodeUp / 1차원 배열 / 1416번 / 2진수 변환 / C++ (0) | 2020.10.03 |
CodeUp / 1차원 배열 / 1412번 / 알파벳 개수 출력하기 / C++ (0) | 2020.10.02 |