인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.
문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅
입력예제 1
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 59 12 48 29 80
출력예제 1
42 34
43 42
53 53
45 36
50 45
41 37
54 64
43 44
49 50
풀이
2차원 배열 탐색 문제
평균을 구하고, 한 행에서 그 행의 평균과 가장 거리가 가까운 값을 찾는다.
- 주의해야 할 점
(1) 9x9행렬에서 배열크기를 [9][9]로 잡으면 안되고 [10][10]으로 잡아야 함
(2) 정수/실수 => 실수, 문제의 예시에서 평균값에서 반올림 된 값을 사용하고 있으므로 (한 행의 총 합계/9.0) + 0.5로 올림 필요
- 생각해야 할 점
(1) 평균값과 한 행의 숫자들과의 거리를 파악하는 방법
=> 해당값과 평균값의 차이가 작으면 된다. 하지만 음수가 나올수도 있기 때문에 절댓값이 필요함
=> algorithm 헤더에서 제공하는 abs함수 사용 ex] abs(a[i][j]-avg)<min
(2) tmp값을 구하는게 아닌 가장 거리가 작은 위치의 값을 출력하기 때문에 res 변수에 a[i][j] 값을 넣어줌
(3) 거리가 같은게 나왔을 때는 큰 값을 출력
=> if(tmp==min)
=> min값: 지금까지 가장 작은 거리값, res값: 그 거리를 가진 배열 값, tmp값: a[i][j]를 통해 새로 구해진 가장 작은 거리값
=> 현재 a[i][j]값과 res값을 비교해 현재a[i][j]가 res보다 큰 값일 시 교체해준다. if(a[i][j]>res) res=a[i][j]
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int a[10][10];
// 48. 각 행의 평균과 가장 가까운 값
int main() {
int i, j, sum, avg, min, tmp, res;
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; //9로 나누면 소숫점이 생기지 않음 (실수/정수 => 실수), +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;
}
'알고리즘' 카테고리의 다른 글
50. 영지(DP) (0) | 2020.12.29 |
---|---|
49. 블록의 최댓값 (0) | 2020.12.28 |
47. 봉우리 (0) | 2020.12.23 |
46. 멀티태스킹(카카오 먹방 문제 변형) (0) | 2020.12.22 |
45. 공주구하기 (0) | 2020.12.21 |