[알고리즘] 문제풀이 연습
[알골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];
}