🤯 코딩테스트/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 취업을 위한 알고리즘 문제풀이' 강의를 듣고 작성한 글입니다.