문제 설명
민준이는 뒤늦게 정보 과목의 중요성을 깨닫고 학습실에서 공부를 하고 있다.
기본 공부가 너무 안 되어 있어 아주 쉬운 문제부터 어려움을 겪은 민준이는 친구에게 물어보려고 한다.
가장 잘 하는 친구에게 물어보기는 질문의 내용이 너무 부끄러워 n명의 친구들 중 정보 성적이 3번째로 높은 친구에게 묻고자 한다.
친구들의 성적은 모두 다르다.
n명의 친구들의 이름과 정보 성적이 주어졌을 때 성적이 세 번째로 높은 학생의 이름을 출력하시오.
입력
첫째 줄에 n이 입력된다. ( 3 <= n <= 50 )
둘째 줄 부터 n+1행까지 친구의 이름과 점수가 공백으로 분리되어 입력된다. 이름은 영문
출력
세 번째로 높은 학생의 이름을 출력한다.
입력 예시
5
minsu 78
gunho 64
sumin 84
jiwon 96
woosung 55
출력 예시
minsu
#include <stdio.h>
int main(void){
int n,temp=0;
char name[50][50]={};
int grade[50];
int point[50];
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%s %d", name[i], &grade[i]);
point[i]=grade[i];
}
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(point[i]<point[j]){
temp=point[j];
point[j]=point[i];
point[i]=temp;
}
}
}
for(int i=0;i<n;i++){
if(grade[i]==point[2]){
printf("%s", name[i]);
}
}
}
이 문제 역시 더 어렵게 꼬아서 풀려고 했다. 그리고 배열의 의미를 잘 이해 못했는지 오류도 있었다. 우선 문자열 배열이다. 입력을 받는데 나는 []로 단일로 풀려고 했는데 오류가 계속 나길래 [] []로 풀었더니 해결이 되었다. 문자열일때는 이것이 필요한 것 같고 문자열 %s를 저장할 때에는 &를 안써줘도 된다는 것.
그리고 for문이 조금 이해가 덜 되었다. 입력 받은 숫자보다 하나 작게해야 한다는 거.
아마도 i는 기존에 있는 것이고 j는 확인을 위한 것일것 같다.
비교할 때 입력 초과가 되서 그렇지 않을까? 그리고 temp로 넣어주면서 point에서의 배열 변경. 그래도 grade의 배열은 변함이 없을 것이니까. 이런 점을 이용해서 출력을 확인할 수 있을 것이다. 자리가 3번째인 point[2]와 같은 값을 grade배열에서 탐색을 해주고 그 i를 printf를 이용해 문자열을 출력해주면 될 것 같다.
'C language > Codeup' 카테고리의 다른 글
[C] 코드업 문제풀이 1805:입체기동장치 생산공장 (0) | 2021.08.19 |
---|---|
[C] 코드업 문제풀이 1535:함수로 가장 큰 값 위치 리턴하기 (0) | 2021.08.19 |
[C] 코드업 문제풀이 1172: 세수 정렬하기 (0) | 2021.08.18 |
[C] 코드업 문제풀이 1460: 2차원 배열 순서대로 채우기 1-1 (0) | 2021.08.18 |
[C] 코드업 문제풀이 1295: 알파벳 대소문자 변환 (0) | 2021.08.18 |