개발자 톡
c 코드 공유합니다. 효율적으로 짜진 않았고 그냥 나열식으로 짰어요
- 등록일
- 2024-04-28 23:22:51
- 조회수
- 291
- 작성자
- gkgkgk464
#include <stdio.h>
#include <math.h>
int value = 0;
int values[3][3] = {0,};
int main(void)
{
for(int i = 0; i < 3; i ++){
for(int j = 0; j < 3; j ++){
scanf("%d",&value);
values[i][j] = value;
}
}
int old_diff = 10;
int new_diff = 0;
// 가로
for(int i = 0; i < 3; i ++){
new_diff = abs(values[i][0] - values[i][1]);
new_diff = new_diff + abs(values[i][0] - values[i][2]);
if (new_diff < old_diff){
old_diff = new_diff;
}
new_diff = abs(values[i][1] - values[i][0]);
new_diff = new_diff + abs(values[i][1] - values[i][2]);
if (new_diff < old_diff){
old_diff = new_diff;
}
new_diff = abs(values[i][2] - values[i][0]);
new_diff = new_diff + abs(values[i][2] - values[i][1]);
if (new_diff < old_diff){
old_diff = new_diff;
}
}
// 세로
for(int i = 0; i < 3; i ++){
new_diff = abs(values[0][i] - values[1][i]);
new_diff = new_diff + abs(values[0][i] - values[2][i]);
if (new_diff < old_diff){
old_diff = new_diff;
}
new_diff = abs(values[1][i] - values[0][i]);
new_diff = new_diff + abs(values[1][i] - values[2][i]);
if (new_diff < old_diff){
old_diff = new_diff;
}
new_diff = abs(values[2][i] - values[0][i]);
new_diff = new_diff + abs(values[2][i] - values[1][i]);
if (new_diff < old_diff){
old_diff = new_diff;
}
}
printf("%d",old_diff);
return 0;
}
어차피 최대 높이는 3으로 지정되어있기 때문에 가정 하에 짰습니다.
예를 들어
1 2 3
1 1 1
1 3 3
위와 같이 배열되어 있을 때,
1 행을 보면 1 2 3 으로 되어 있습니다.
이 경우 1 을 2로 바꾸고 3도 2로 바꾸어 2 2 2 로 맞추고 총 두 번의 수정이 가장 짧은 루트인데
이를 구하는 방법을 각 원소의 차이의 절댓값의 합으로 구했습니다.
(0,0)을 기준으로 잡음
1 - 2 = |-1| = 1
1 - 3 = |-2| = 2
절댓값의 합 = 3
(0,1)을 기준으로 잡음
2 - 1 = 1
2 - 3 = |-1| = 1
절댓값의 합 = 2
(0,2)를 기준으로 잡음
3 - 1 = 2
3 - 2 = 1
절댓값의 합 = 3
따라서 가장 작은 합은 2
이런 식으로 3 by 3 을 모두 순회해서 가장 작은 합을 구했습니다.