5623번 - 수열의 합

의혁·2024년 12월 29일
0

[Algorithm] 알고리즘

목록 보기
5/50

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

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=' ')
  • 수학적인 접근 법을 사용했다.
  • 문제를 잘 읽어보면, "수열 A는 유일하다." 를 잘 참고해야한다.
    (N이 2인 경우에는 어떤 수가 나와도 a와 b는 동일한 수여야 수열은 항상 유일하다)

💡 사용한 수학적 접근법
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] << ' ';
		}
	}
  • 되게 똑똑한 방식으로 푸신거 같습니다
  • 전체 합을 다 더하는 것이 아니라 "A[0]"만을 위해서 과정을 최소화하셨다.
  • N이 3 이상이면 ,array[0][1] 과 array[0][2] 와 array[1][2] 만 생각하면. A[0]을 구할 수 있다.
profile
매일매일 차근차근 나아가보는 개발일기

0개의 댓글