Algorithm

[Baekjoon]1812번 사탕 - Javascript

호밀이 2024. 2. 6. 21:27

https://www.acmicpc.net/problem/1812

 

1812번: 사탕

첫째 줄에 N(3 ≤ N ≤ 999, N은 홀수)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 1번 학생과 2번 학생이 가지고 있는 사탕의 수의 합, 2번 학생과 3번 학생이 가지고 있는 사탕의 수의 합, …, N-1번 학

www.acmicpc.net

문제

N(3≤N≤999, N은 홀수)명의 학생들이 원 모양으로 둘러앉아 있다. 각 학생들은 모두 몇 개의 사탕(≤100,000)을 가지고 있는데 그 개수는 사람마다 다를 수 있고, 사탕을 아예 가지고 있지 않을 수도 있다. 물론 사탕의 개수는 음이 아닌 정수이다.

편의상 학생들에게 번호를 매기는데, 반시계 방향으로 1번 학생, 2번 학생, …, N번 학생으로 번호를 매겼다. 1번 학생 오른쪽엔 2번 학생, 2번 학생 오른쪽엔 3번 학생이 앉아 있는 것이고, 마지막 N번 학생 오른쪽엔 1번 학생이 앉아 있게 된다.

우리는 인접한 두 학생이 가지고 있는 사탕의 수의 합을 안다. 즉 1번 학생과 2번 학생이 가지고 있는 사탕의 수의 합, 2번 학생과 3번 학생이 가지고 있는 사탕의 수의 합, …, N-1번 학생과 N번 학생이 가지고 있는 사탕의 수의 합, 마지막으로 N번 학생과 1번 학생의 가지고 있는 사탕의 수의 합을 안다. 이때, 각 학생이 가지고 있는 사탕의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N(3 ≤ N ≤ 999, N은 홀수)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 1번 학생과 2번 학생이 가지고 있는 사탕의 수의 합, 2번 학생과 3번 학생이 가지고 있는 사탕의 수의 합, …, N-1번 학생과 N번 학생이 가지고 있는 사탕의 수의 합, 마지막으로 N번 학생과 1번 학생의 가지고 있는 사탕의 수의 합이 순서대로 주어진다.

출력

첫째 줄부터 N개의 줄에 걸쳐 1번 학생이 가지고 있는 사탕의 수, 2번 학생이 가지고 있는 사탕의 수, …, N번 학생이 가지고 있는 사탕의 수를 순서대로 출력한다. 출력하는 수는 음이 아닌 정수들이어야 하며, 항상 답이 존재하는 경우만이 입력으로 주어진다고 가정해도 좋다.

예제 입력 1 복사

3
5
7
6

예제 출력 1 복사

2
3
4

 

문제풀이(1)

처음에는 a의 값에 0부터 1씩 증가하면서 a의 값을 먼저 찾은 뒤 모든 값을 빼서 각 학생별 사탕의 개수를 구하려햇다.
하지만, 학생의 수가 늘수록 실행시간이 높아질 수 있음을 깨달았다.
그래서 방법을 바꿨다. 직접 그려보면서 공식을 찾았다.
1. 첫번째 학생의 사탕의 개수를 구한다. (a - b + c)/2 <- 홀수이기 때문에 가능 짝수일 경우 0이 나옴.
2. i번째 학생과 i+1번째 학생의 사탕개수의 합 - i번째 학생의 사탕개수를 빼주면 i+1번째 학생의 사탕개수를 구할 수 있다.

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const [N, ...arr] = require("fs").readFileSync(filePath).toString().trim().split("\n").map(Number);

let calc = 0;
const students = [];

// 첫번째 학생의 개수를 구하는 공식 (a - b + c)
for (let i = 0; i < N; i++) {
  calc += i % 2 ? -arr[i] : arr[i];
}

students.push(calc / 2);

// 각학생별 사탕의 개수 구하는 공식
for (let i = 0; i < N - 1; i++) {
  students.push(arr[i] - students[i]);
}

console.log(students.join("\n"));