본문 바로가기
알고리즘 문제

[알고리즘 문제] Prosjek

by 박연호의 개발 블로그 2019. 4. 6.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int[] a = new int[n]; // 일반 정수배열
        int[] b = new int[n]; // a배열의 n번까지의 합을 n으로 나눈 값을 저장할 배열
        int sum; // a배열에서 n번째까지의 합

        for (int i = 0; i < n; i++) {
            b[i] = sc.nextInt();
        }

        a[0] = b[0]; // a[0]은 a[0]까지의 값은 한번 나눈 값이므로 초기화 해줌
        sum = a[0]; // sum 또한 a[0]을 제외하고 누적된 값이 없으므로 초기화

        for (int j = 1; j < n; j++) { 
            a[j] = (b[j] * (j + 1)) - sum; // 누적된값+a[n]/n = b[n]에서 a[n]을 왼쪽에 놓고 모든 값을 오른쪽으로 넘김. 미지수 x구하는 방법
            sum += a[j]; // sum에 누적값 계산
        }

        for (int s = 0; s < n; s++) {
            System.out.print(a[s] + " ");
        }

    }
}

a배열에는 일반 정수가 들어가고, b배열에는 a배열에서 0~j번째까지의 정수의 합을 n까지의 정수갯수로 나눈 값이 j번쨰에 들어가게 된다.

문제는 b배열의 값이 주어지고 a배열을 구하라는 문제이다.

 

아이디어는 먼저 a[0]을 1로 나누어 봤자 b[0]이기 때문에 a[0]=b[0]을 해주었다. 그리고 sum으로 누적값을 계산하였다. 

sum은 a배열의 j-1까지의 합이니, sum+a[j]을 j번까지의 총 합이된다. 몇번째 숫자인지 j+1을 사용하여 나눠주면 그 값은 b[j]이 된다. 결국 공식은 sum+a[j]/j+1=b[n]이 되는데 여기서 좌항에는 a[j]만 남겨두고 모두 우항에 넘겨준다. 그러면 a[j]값을 구할 수 있다. 방정식에서 x를 좌항에 놔두고 모두 우항에 넘겨서 x값을 구하는 것처럼 풀었다. 

'알고리즘 문제' 카테고리의 다른 글

[알고리즘 문제]  (0) 2019.04.08
[알고리즘 문제] attackRange  (0) 2019.04.08
[알고리즌 문제] BeeHive  (0) 2019.04.06
[알고리즘 문제] Seat  (0) 2019.04.04
[알고리즘 문제] Tetris  (0) 2019.04.03