학생들 중에서 세 명의 정수 번호를 더했을 때 합이 0이 되는 조합의 수를 찾는 문제로 주어진 정수 배열에서 이러한 조합의 수를 계산하여 반환하는 solution 함수를 작성하라.
const solution = (number) => {
let partner = 0;
for (let x=0; x<number.length; x++) {
for (let y=x+1; y<number.length; y++) {
for (let z=y+1; z<number.length; z++) {
if (number[x] + number[y] + number[z] === 0) {
partner++;
}
}
}
}
return partner;
}
이 문제에서 가장 많이 틀리는 부분은 x, y, z의 시작점을 0으로 잡는 것이다. 0으로 잡게 되면 같은 학생만 동시에 3번 뽑을 수 있기 때문이다. 이를 방지하기 위해서 x의 시작점은 0, y의 시작점은 x보다 하나 큰 x+1, z의 시작점 또한 y보다 하나 큰 y+1로 하면 된다.
for문에는 초기화 부분, 조건 부분, 증감 부분이 존재한다. 이 부분을 생략할 수 있는데 방법은 아래와 같다.
초기화 부분을 생략하면 변수를 for 문 외부에서 초기화해야 한다.
let i = 0;
for (; i < 10; i++) {
console.log(i);
}
조건 부분을 생략하면 루프가 무한 루프가 되므로, 내부에서 조건을 검사하여 break 문을 사용하여 루프를 종료해야 한다.
for (let i = 0; ; i++) {
if (i >= 10) { // 조건을 루프 내부에서 검사
break;
}
console.log(i);
}
증감 부분을 생략하면 증감을 for 문 내부에서 처리해야 한다.
for (let i = 0; i < 10;) {
console.log(i);
i++;
}
두 부분을 모두 생략하면 각각의 작업을 for 문 외부와 내부에서 처리해야 한다.
let i = 0;
for (; i < 10;) {
console.log(i);
i++;
}
초기화, 조건, 증감 부분을 모두 생략할 수도 있지만, 이는 무한 루프가 되므로 내부에서 종료 조건을 반드시 처리해야 한다.
let i = 0;
for (;;) {
if (i >= 10) { // 조건을 루프 내부에서 검사
break;
}
console.log(i);
i++; // 증감을 루프 내부에서 처리
}
주의할 점은 초기화 부분과 조건 부분을 생략할 시,
세미콜론(;)은 남겨 두어야 한다는 점이다.
최소공배수와 최대공약수를 구하려면
유클리드 알고리즘을 사용해야 하나 여기선 그 방법을 사용하지 않음.
최대공약수는 영어로 GCD (Greatest Common Divisor)라고 한다.
let num = 0;
const gcd = (a, b) => {
for (let i = 1; i <= Math.min(a, b); i++) {
if (a % i === 0 && b % i === 0)
num = i;
}
return num;
};
• let num = 0;: 최대공약수를 저장할 변수를 선언한다.
• const gcd = function (a, b) {...}: 최대공약수를 구하는 함수를 선언한다.
• for (let i = 1; i <= Math.min(a, b); i++) {...}: 1부터 a와 b 중 작은 값까지 반복한다.
• if (a % i === 0 && b % i === 0) num = i;: a와 b가 모두 나누어 떨어지는 값을 num에 저장한다.
• return num;: 최대공약수를 반환한다.
최소공배수는 영어로 LCM (Least Common Multiple)라고 한다.
let num = 0;
const lcm = (a, b) => {
for (let i = Math.max(a, b); i <= a * b; i++) {
if (i % a === 0 && i % b === 0) {
num = i;
break;
}
}
return num;
};
• let num = 0;: 최소공배수를 저장할 변수를 선언한다.
• const lcm = function (a, b) {...}: 최소공배수를 구하는 함수를 선언한다.
• for (let i = Math.max(a, b); i <= a * b; i++) {...}: a와 b 중 큰 값부터 a * b까지 반복한다.
• if (i % a === 0 && i % b === 0) { num = i; break; }: a와 b 모두 나누어 떨어지는 가장 작은 값을 num에 저장하고 루프를 종료한다.
• return num;: 최소공배수를 반환한다.