💡 수학적 사고가 필요한 문제는 수학적으로 접근해보자!!

N = int(input())
array = [[0]*N for _ in range(N)]
total = 0
for i in range(N):
array[i] = list(map(int,input().split(' ')))
# 수열의 전체 합 구하기 ()
for j in range(N):
total += sum(array[j])
total = int(total / (2 * (N-1)))
# A[0] + A[1] + .. + A[N-1]
if N > 2:
a = int((sum(array[0][:]) - total) / (N-2))
# N 이 2인 경우에는 무조건 /2를 한 수이다. (유일해야 하기 때문에)
else:
a = int(total / 2)
for k in range(N):
if k == 0:
print(a, end=' ')
elif k == N-1:
print(array[0][-1]-a)
else:
print(array[0][k] - a, end=' ')
💡 사용한 수학적 접근법
1. 입력받은 배열의 모든 요소를 더한다.
2. a+b와 b+a는 동일하기 때문에 배열의 한쪽은 필요없으므로 /2를 해준다.
3. /2를 해준 값은 (N-1) (A[0] + A[1] + A[2] + A[3] )와 동일하다
4. 배열의 첫번째 세로 열의 모든 합은 (N-1) A[0] + A[1] + A[2] + A[3] 와 동일하므로, 3번의 값과 빼주면 A[0]값을 구할 수 있다.
5. 따로서 A[0]값을 구했으므로, 배열의 첫번째 세로 열들의 값과 뺴주면, 다른 모든 값을 구할 수 있다.
<참고 풀이>
오프라인 코테 스터디 (12/30)
참가 인원: 기우석님
if (n != 2) {
int zero = (arr[0][1] + arr[0][2] - arr[1][2]) / 2;
for (int i = 0; i < n; i++) {
if (i == 0)
ans[i] = zero;
else
ans[i] = arr[0][i] - zero;
cout << ans[i] << ' ';
}
}