728x90
문제설명

*주의사항 : 이 (함수 제출형) 문제는 함수 부분만 작성해서 제출해야 오류 없이 채점이 됩니다.
미리 작성되어있는 코드를 읽고 해석해서, 함수 부분만 작성해서 제출하면 됩니다.
작성한 함수의 테스트를 위해서는 제시된 코드를 복사해 사용하면 되고, 제출은 함수 부분만 하세요.

------

배열에서 가장 큰 값이 처음 나타나는 위치를 출력하시오.

단, 함수형 문제이므로 함수 f()만 작성하시오.

[함수형 문제란??]
함수형 문제는 기본적인 main() 등은 미리 작성되어 있습니다.
미리 작성되어 있는 프로그램은 다음과 같습니다.

미리 작성된 프로그램을 복사해 붙여 넣은 후 함수 부분을 설계하여 작성해 넣고,
테스트 한 후, 함수 부분만 제출하세요.

#include <stdio.h>

int n, d[110];

// 이 부분에 들어가야 될 코드를 작성하여 제출
int main()
{
  scanf("%d", &n);

  for(int i=0; i<n; i++)
    scanf("%d", &d[i]);

  printf("%d", f());
  return 0;
}

 

 

입력

첫 줄에 데이터의 개수 n이 입력된다.

두 번째 줄에 n개의 데이터가 공백을 두고 입력된다.

 

 

출력

가장 큰 값이 처음 나타나는 위치를 출력한다.

 

 

입력예시

5

1 3 2 1 3

 

 

출력예시

2

 


int f(){
    int max;
    int num=1;
    for(int i=0;i<n;i++){
        if(i==0){
            max=d[i];
        }
        else{
            if(max<d[i]){
                max=d[i];
                num=i+1;
            }
        }
    }
    return num;
}

이 부분만 코드업 문제에 넣으면 정답이라고 나오게 된다. 

별로 어려울 것 같지 않은데 정답율이 20%대라서 한번 풀어보게 되었다. 함수에 보통 main에 넣던 것들을 넣어주면 되는 것 같다. 열혈c때 계속 함수 넣어서 익숙해진 부분이다.

일단 함수 안에서 max를 선언해주고 num도 선언해주었다. num는 1로 초기화했는데 하나만 입력되어었을 경우때문이다. 이것을 조금 간과해서 몇번 틀렸다. 그리고 if else를 이용해서 해결해주면 되는데 i=0일때는 무조건 max값에 d[0]의 값을 넣어주어야 한다. 열혈c에서는 외부에 지정을 해주었지만 나는 이것이 편하기에 이 방법을 활용한다. 그리고 나머지 경우에는 max와 비교하여 d[i]가 큰 경우에만 바꿔준다. 그리고 여기서는 최종 출력은 num를 출력하므로 i+1를 출력해주어야 한다. 0자리가 아니라 1자리부터 시작이기 때문이다. 그리고 return 값은 num변수를 반환해주면 되는 것이다.

728x90
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
728x90
문제설명

세 수를 오름차순으로 정렬하려고 한다. (낮은 숫자 -> 높은 숫자)

예)

5 8 2   ====> 2 5 8    로 출력

입력

세 정수가 입력된다.

출력

낮은 숫자부터 출력한다.

입력예시

8 7 6

출력예시

6 7 8

#include <stdio.h>
int main(void){
    int a,b,c,temp;
    scanf("%d %d %d", &a, &b,&c);
    if(a>=b){
        temp=a;
        a=b;
        b=temp;
    }
    if(b>=c){
        temp=b;
        b=c;
        c=temp;
    }
    if(a>=b){
        temp=a;
        a=b;
        b=temp;
    }
    printf("%d %d %d", a, b, c);
    return 0;
}

이 문제를 괜히 꼬아서 생각을 했다. 단순 if문으로는 풀 수 없을것이라고 처음에 생각해서 배열로 건드렸는데 잘 되지 않았다. 저장 자체가 제대로 되지 않아 다른 사람의 코드를 보았더니 단순 if 문으로 가능하다는 것을 알 수 있었다. if문 3개로 만들 수 있는데 특이한 점은 마지막 if문과 처음 if문은 같다는 것이다. 같은 이유는 중간의 과정에서 b자리에 다시 큰 값이 올 수 있기 때문이다. 그래서 같은 식을 한번 더 반복을 해주어야 하고 임시의 공간인 temp도 선언해주는 것도 잊지 않으면 된다. 너무 꼬아서 생각하지 말고 깔끔하게 생각하는 연습을 해야겠다.

 

728x90

+ Recent posts