광장에서 모인 사람들과 악수를 하는 행사가 열렸습니다.
참가자인 민규는 몇명의 사람들과 악수를 한 후 중간에 일이 생겨 집으로 갔습니다.
이 행사에서 진행된 악수는 총 n번이라고 했을 때,
민규는 몇 번의 악수를 하고 집으로 돌아갔을까요?
그리고 민규를 포함한 행사 참가자는 몇 명일까요?
- 악수는 모두 1대 1로 진행이 됩니다.
- 민규를 제외한 모든 참가자는 자신을 제외한 참가자와 모두 한번씩 아굿를 합니다.
- 같은 상대와 중복된 악수는 카운트 하지 않습니다.
- 민규를 제외한 참가자는 행사를 모두 마쳤습니다.
예를들어 행사에서 59회의 악수가 진행되었다면 민규는 4번의 악수를 하였고 민규를 포함한 참가자는 12명이다.
행사에서 진행된 악수 횟수(n)를 입력으로 받으면 민규의 악수 횟수와 행사 참가자 수가 출력됩니다.
/**
* 1부터 (num - 1)까지의 합
* @description
* 만약 참가 인원이 num명이라면 각자 (num-1)까지 악수를 하게 된다.
*
* 기존에 1~num 까지의 합이 num * (num + 1) / 2 이지만,
*
* 시그마 공식은 (수의 갯수) * (첫번째 수 + 끝수) / 2 이므로,
*
* (num - 1) * (1 + num - 1) / 2 가 된다.
*
* @param {Number} num
* @returns {Number}
*/
function sigma(num) {
return (num * (num - 1)) / 2;
}
/**
* 민규의 악수 횟수를 얻는 함수
* @param {Number} n 행사에서 진행된 악수 횟수
* @param {Number} participants_cnt 행사 참가자 수
* @returns {Number} 민규의 악수 횟수
*/
function getMinGyuHandshakeCount(n, participants_cnt) {
// 민규는 악수 도중에 가버렸으므로 -1
return n - sigma(participants_cnt - 1);
}
/**
* 행사 참가자 수를 얻는 함수
* @param {Number} n 행사에서 진행된 악수 횟수
* @returns {Number} 행사 참가자 수
*/
function getParticipantsCount(n) {
let result = 0;
while (sigma(result) < n) {
result++;
}
return result;
}
function solution(n) {
const participants_cnt = getParticipantsCount(n);
const mingyu_handshake_cnt = getMinGyuHandshakeCount(n, participants_cnt);
const result = [mingyu_handshake_cnt, participants_cnt];
console.log(result);
}
const n = 59;
solution(n);
'PS > 제코베 JS 100제' 카테고리의 다른 글
제코베 JS 100제 / 69 / 골드바흐의 추측 (0) | 2022.09.09 |
---|---|
제코베 JS 100제 / 68 / 버스 시간표 (0) | 2022.09.08 |
제코베 JS 100제 / 66 / 블럭탑쌓기 (0) | 2022.09.05 |
제코베 JS 100제 / 65 / 변형된 리스트 (0) | 2022.09.05 |