Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

아무거나 내꺼 공부할래

[개념] 각 행의 가장 가까운 값 / c / 제한시간 없음 본문

[c언어&c++] 알고리즘 공부/개념

[개념] 각 행의 가장 가까운 값 / c / 제한시간 없음

mero95 2021. 1. 29. 15:40

▣ 입력설명

입력 예시과 같이 9 × 9 격자판에 쓰여진 81개의 자연수가 주어질 때, 각 행의 평균을 구하고, 그 평균과 가장 가까운 값을 출력하는 프로그램을 작성하세요. 평균은 소수점 첫 째 자리에서 반 올림합니다. 평균과 가까운 값이 두 개이면 그 중 큰 값을 출력하세요.

 

▣ 입력설명

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

 

▣ 출력설명

- 첫째 줄에 첫 번째 줄부터 각 줄에 각행의 평균과 그 행에서 평균과 가장 가까운 수를 출력한다.

 

▣ 입력 예시

3 23 85 34 17 74 25 52 65
10 7 39 42 88 52 14 72 63
87 42 18 78 53 45 18 84 53
34 28 64 85 12 16 75 36 55
21 77 45 35 28 75 90 76 1
25 87 65 15 28 11 37 28 74
65 27 75 41 7 89 78 64 39
47 47 70 45 23 65 3 41 44
87 13 82 38 50 12 48 29 80

 

▣ 출력 예시

42 34
43 42
53 53
45 36
50 45
41 37
54 64
43 44
49 50

 

<코드>

#pragma warning(disable:4996)
#include<stdio.h>
int main() {
	int graph[9][9];
	int i, j;
	int avg;
	int temp;
	int min;
	int sum;
	int ans = 0;
	for (i = 0; i < 9; i++) {
		for (j = 0; j < 9; j++) {
			scanf("%d", &graph[i][j]);
		}
	}

	for (i = 0; i < 9; i++) {
		sum = 0;
		min = 100;
		for (j = 0; j < 9; j++) {
			sum = sum + graph[i][j];
		}
		avg = (sum / 9.0) + 0.5;
		printf("%d ", avg);
		for (j = 0; j < 9; j++) {
			temp = abs(avg - graph[i][j]);
			if (temp < min) {
				min = temp;
				ans = graph[i][j];
			}
			else if (temp == min && temp > graph[i][j]) temp = graph[i][j];
		}
		printf("%d\n", ans);
	}

	return 0;
}

핵심코드 : avg = (sum / 9.0) + 0.5;

반올림을 할때 ceil같은 함수를 쓰게되면 자료형이 복잡해진다. 그래서 실수형(9.0)으로 계산을 해주고 int형인 변수에 입력을 하면 결과는 자연스럽게 int형으로 저장된다.