JavaScript Coding Test 8.

JUNHYUK JUNG·2024년 6월 21일

JavaScriptCodingTest

목록 보기
8/9

배열 안에서 숫자를 3개를 뽑았을 때 합이 0이 될 경우의 수

학생들 중에서 세 명의 정수 번호를 더했을 때 합이 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문에는 초기화 부분, 조건 부분, 증감 부분이 존재한다. 이 부분을 생략할 수 있는데 방법은 아래와 같다.

초기화 부분 생략

초기화 부분을 생략하면 변수를 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;: 최소공배수를 반환한다.

0개의 댓글