728x90
문제 설명

민준이는 뒤늦게 정보 과목의 중요성을 깨닫고 학습실에서 공부를 하고 있다.

기본 공부가 너무 안 되어 있어 아주 쉬운 문제부터 어려움을 겪은 민준이는 친구에게 물어보려고 한다.

가장 잘 하는 친구에게 물어보기는 질문의 내용이 너무 부끄러워 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를 이용해 문자열을 출력해주면 될 것 같다.

728x90

+ Recent posts