[알고리즘] 문제풀이 연습

[알골90제] 48번 - 각 행의 평균과 가장 가까운 값 (2차원 배열 탐색)

ddgoori 2019. 7. 28. 21:37

* 문제:

1) 9*9 격자판에 81개의 자연수가 주어짐

2) 각 행의 평균을 구함

3) 각 행의 평균과 가장 가까운 값 출력

- 평균은 소수 점 첫 째 자리에서 반올림

- 가까운 값이 2개이면 그 중 큰 값을 출력

 

* 입력: 

1~9번째 줄까지 한줄에 1개씩 100보다 작은 자연수가 주어짐

 

* 출력:

각 행별 평균과 그 평균과 그 행에서 평균과 가장 가까운 수 나란히 출력

 

ex) 

42 34

43 42

53 53

.

.

.

 

* 계획:

1) 9*9를 2차원 배열로 입력받음

2) 각 행별로 평균을 구함

3) 구한 평균을 두고 1~9까지 순서대로 빼서 abs해줌.

4) 절대값이 가장 작은 수가 평균과 가장 가까운 값

 

 

* 코드

// 48번 - 각 행의 평균과 가장 가까운 값

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>
int a[10][10];

int main() {

	freopen("input.txt", "rt", stdin);
	int sum = 0, avg, temp, res;

	for (int i = 1; i <= 9; i++) {
		sum = 0;
		for (int j = 1; j <= 9; j++) {
			scanf("%d", &a[i][j]);
			sum += a[i][j];
		}
		avg = (sum / 9.0)+0.5;
		printf("%d ", avg);
		int min = 999999999; //min을 다시 리셋해줘야함

		for (int j = 1; j <= 9; j++) {
			temp = abs(a[i][j]- avg);
			if (temp < min) {
				min = temp;
				res = a[i][j];
			}
			else if (temp == min) {
				if (a[i][j] > res)
					res = a[i][j];
			}
		}
		printf("%d\n", res);
	}
	return 0;
}

 

* 중요

1) 평균의 소수 첫째자리 반올림 방법?

=> ex) 48.78이면 0.5더한 후 int형으로 만들기

2) sum/9할때 9를 9.0으로 나눠줘야한다. 답이 실수가 나오도록..

avg = (sum/9.0)+0.5;    //avg가 int형이라 소수첫째자리 날라감

//원래라면 내림으로 되어서 반올림이 안되는데 0.5를 더해서 int형으로 해줬을 때 반올림으로 연산됨

3) 가장 가까운 값을 찾을 때 abs 절대값으로 구함. 

=> 이때, temp로 계산한 값을 저장하고 temp와 min값 비교해서 가장 가까운 값 res = a[i][j]해주기.

=> 기존min의 가장 작은 절대값과 현재 계산한 절대값temp이 같을때 두 수의 원래 값 중 더 큰 값을 넣어야함.

	else if (temp == min) {
				if (a[i][j] > res)
					res = a[i][j];
			}