* 문제:
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];
}
'[알고리즘] 문제풀이 연습' 카테고리의 다른 글
[알골90제] 50/51번 - 브루트포스/다이나믹프로그래밍 : 오렌지나무 territory 선택 (small/big) (0) | 2019.07.29 |
---|---|
[알골90제] 49번 - 쌓기 블록의 최대값 (2차원 배열 응용) (0) | 2019.07.28 |
[알골90제] 47번 - 봉우리 (2차원 배열 탐색) (0) | 2019.07.26 |
[알골90제] 46번 - 멀티태스킹 (카카오 먹방 문제 변형) (0) | 2019.07.26 |
[알골 90제] 37번 - LRU 카카오 캐시 문제 변형 (0) | 2019.07.23 |