이번 문제는 정해진 개수만큼 숫자를 입력받고 최댓값과 최대값이 있는 위치를 찾는 문제로 배열을 이용하면 쉽게 최댓값과 최대값이 몇 번째에 있었는지 찾을 수 있습니다. 그리고 배열 없이도 문제를 해결할 수 있는데, 어떻게 할 수 있을지 두개의 코드로 보여드리겠습니다.
문제
9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.
입력
첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
출력
첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.
생각 및 풀이과정
- 입력 개수가 9개로 정해져있으니 정수형 배열로 길이는 9개로 설정해야겠다. (배열 없이도 가능합니다.)
- 자연수는 100보다 작다고 하였으니 int형보다 char형 배열로 해도 되긴하겠다.
- 최댓값 위치를 담을 수 있는 변수를 하나 만들자.
- 반복문을 이용해서 최댓값과 최댓값 위치를 찾자.
- 최댓값과 최댓값 위치를 출력하자.
코드 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 |
댓글