🤯 코딩테스트/C/C++
[it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비] 2차원 배열 탐색 - 각 행의 평균과 가장 가까운 값
kangkibong
2022. 9. 20. 22:18
문제
<그림 1>과 같이 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
코드
첫 번째 풀이
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main(int argc, char *argv[])
{
int i, j, avg, min, tmp;
float sum;
// 2차원 배열
vector<vector<int> >a(10, vector<int> (10));
// 평균값
vector<int> b(10);
for(i = 1; i <= 9; i++) {
sum = 0;
for(j = 1; j <= 9; j++) {
scanf("%d", &a[i][j]);
sum += a[i][j];
}
avg = round(sum / 9);
b[i] = avg;
}
for(i = 1; i <= 9; i++) {
sum = 0;
tmp = abs(b[i] - a[i][1]);
min = a[i][1];
for(j = 1; j <= 9; j++) {
if(abs(b[i] - a[i][j]) < tmp) {
tmp = abs(b[i] - a[i][j]);
min = a[i][j];
}
}
printf("%d %d\n", b[i], min);
}
return 0;
}
최종 풀이
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int a[10][10];
int main() {
int i, j, sum, avg, tmp, res, min;
for(i = 1; i <= 9; i++) {
sum = 0;
for(j = 1; j <= 9; j++) {
scanf("%d", &a[i][j]);
sum += a[i][j];
}
avg = (sum / 9.0) + 0.5;
printf("%d " , avg);
min = 2147000000;
for(j = 1; j <= 9; j++) {
tmp = abs(a[i][j] - avg);
if(tmp < min) {
min = tmp;
res = a[i][j];
} else if(tmp == min) {
if(a[i][j] > res) {
res = a[i][j];
}
}
}
printf("%d\n", res);
}
return 0;
}
설명
9크기의(index 1이상부터 할당) a배열을 선언하고 1~9까지 입력을 받으면서 각 행의 합을 구한다.
구한 합을 통해 평균값의 반올림을 구하기 위해 0.9로 나누고 0.5를 더하여 int로 형변환한 값으로 설정한다.
최소값을 구하기 위해 min에 최대범위값을 할당해놓고 각 배열의 값에서 평균을 뺀 절댓값을 tmp에 할당해나간다.
해당 tmp값이 min보다 작을 경우 min에 tmp를 할당하고 해당 배열의 값을 res에 할당한다. 만약 해당 tmp값이 min과 같을 경우 둘 중 최대값으로 할당해야 하므로 res보다 큰 경우를 할당한다.
이후 최종적으로 res를 출력하여 마무리한다.
배운 점
<cmath> 헤더파일에 있는 round() method를 사용하여 반올림할 수 있다.
<algorithm> 헤더파일에 abs() method가 포함되어있다.
해당 내용은 김태원님의 'it 취업을 위한 알고리즘 문제풀이' 강의를 듣고 작성한 글입니다.