본문 바로가기
C언어/BOJ

[C언어] 백준 2562번 최댓값

by Oliver_Candy 2023. 3. 5.

이번 문제는 정해진 개수만큼 숫자를 입력받고 최댓값과 최대값이 있는 위치를 찾는 문제로 배열을 이용하면 쉽게 최댓값과 최대값이 몇 번째에 있었는지 찾을 수 있습니다. 그리고 배열 없이도 문제를 해결할 수 있는데, 어떻게 할 수 있을지 두개의 코드로 보여드리겠습니다.

 

 문제

 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

 

 입력

 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

 

 출력

 첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

 

 생각 및 풀이과정

  1.  입력 개수가 9개로 정해져있으니 정수형 배열로 길이는 9개로 설정해야겠다. (배열 없이도 가능합니다.)
  2.  자연수는 100보다 작다고 하였으니 int형보다 char형 배열로 해도 되긴하겠다.
  3.  최댓값 위치를 담을 수 있는 변수를 하나 만들자.
  4.  반복문을 이용해서 최댓값과 최댓값 위치를 찾자.
  5.  최댓값과 최댓값 위치를 출력하자.

 

 

 

 코드 1 (배열을 사용한 코드)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    char list[9];
    int i;
    char max = 0;
    int max_pos;

    for (i = 0; i < 9; ++i) {
        scanf("%d", &list[i]);
        if (max < list[i]) {
            max = list[i];
            max_pos = i + 1;
        }
    }
    printf("%d\n%d", max, max_pos);

    return 0;
}

이 문제는 정수 받는 개수가 정해져있기 때문에 배열의 길이를 9개로 정해서 해결할 수 있었습니다. 하지만 배열이 없어도 이 문제를 해결할 수 있습니다. 다음 코드에서는 배열 없이 작동하는 코드를 보여드리겠습니다.

 

 코드 2 (배열없는 코드)

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif /* _CRT_SECURE_NO_WARNINGS */
#include <stdio.h>

int main(void)
{
    char temp_num;
    char max_num = 0;
    int i;
    int max_pos;
    
    for (i = 0; i < 9; ++i) {
    	scanf("%d", &temp_num);
        if (temp_num > max_num) {
            max_num = temp_num;
            max_pos = i + 1;
        }
    }
    
    printf("%d\n%d", max_num, max_pos);
    
    return 0;
}

 

이 문제는 자연수를 받는 코드여서 max_num를 0으로 초기화 하기에 scanf함수를 반복문안에서만 넣어도 상관이 없는 코드입니다. 하지만 나중에 최댓값이 음수도 가능하다면 이 코드는 부적절한 코드입니다. 다음 코드에서는 자연수가 아니라 음수에서도 적용이 가능한 것을 보여드리겠습니다.

 

 

 

 코드 3 (음수가 들어와도 적용이 가능한 코드)

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif /* _CRT_SECURE_NO_WARNINGS */

#include <stdio.h>

int main(void)
{
    int temp_num;
    int i;
    int max_num;
    int max_pos;
    
    scanf("%d", &max_num);
    
    for (i = 0; i < 9; ++i) {
        scanf("%d", &temp_num);
        if (temp_num > max_num) {
            max_num = temp_num;
            max_pos = i + 1;
        }
    }
    
    printf("%d\n%d", max_num, max_pos);
    
    return 0;
}

이번에 코드는 배열없이 음수가 들어오더라도 최댓값을 구할  수 있는 코드입니다. 반복문 전에 scanf()함수를 사용하는데요, 그 이유는 첫 번째 입력받는 값을 기준으로 그 이후에 입력받는 값이랑 비교를 해야되기 때문에 반복문 전에 scanf()함수를 한 번 작성해야합니다. 그렇게 하지않고 반복문만 넣는다면 처음에 입력받고 나서 비교할 기준 숫자가 없기 때문입니다. 

'C언어 > BOJ' 카테고리의 다른 글

[C언어] 백준 1546번 평균  (0) 2023.02.25
[C언어] 백준 1157번 단어 공부  (0) 2023.02.25
[C언어] 백준 1152번 단어의 개수  (0) 2023.02.20
[C언어] 백준 1000 번 A+B  (0) 2023.02.20

댓글