Post

알고리즘 문제 간단 정리 02

알고리즘 02

알고리즘 간단 정리 두번째 글입니다.

1. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
{
        let a, b, result;
        a = 7, b = 4
        result = a | b;
    
        console.log(result)
}

주어진 코드는 비트 OR 연산자 |를 사용하여 변수 ab의 비트 OR 연산을 수행하고 결과를 result 변수에 할당한 후, result 변수의 값을 출력하는 것입니다.

여기서 ab는 각각 7과 4로 초기화됩니다. 이 값들은 7과 4의 이진수 표현에서 각 비트의 상태를 나타냅니다.

7은 이진수로 0111로 표현됩니다. 4는 이진수로 0100로 표현됩니다.

비트 OR 연산은 두 비트 중 하나 이상이 1이면 결과도 1이 되고, 그렇지 않으면 0이 됩니다.

따라서 0111 | 0100을 계산하면 01110100의 각 비트를 OR 연산한 결과가 되며, 결과는 0111입니다. 이진수 0111을 십진수로 변환하면 7이 됩니다.

따라서 코드는 7을 출력합니다.

2. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
        function solution(a, b, c){
                let answer = "YES", max;
                let total = a + b + c;
        
                if(a > b) max = a;
                else max = b;
                if(c > max) max = c;
                if(total-max <= max) answer = "NO"; 
                
                return answer;
        }
    
        console.log(solution(53, 93, 107));
}

주어진 코드는 세 개의 숫자를 매개변수로 받아들여 가장 큰 수를 찾은 다음, 해당 수를 제외한 나머지 두 수의 합이 가장 큰 수와 같거나 작으면 “NO”를 반환하고, 그렇지 않으면 “YES”를 반환하는 함수입니다.

여기서는 53, 93, 107을 매개변수로 전달하여 함수를 호출하고 있습니다.

함수 내부를 살펴보겠습니다:

  1. answer 변수를 “YES”로 초기화합니다.
  2. 세 수의 합을 계산하여 total 변수에 저장합니다.
  3. a, b, c 중에서 가장 큰 수를 찾아 max 변수에 저장합니다.
  4. 세 수의 합에서 가장 큰 수를 뺀 값이 가장 큰 수와 같거나 작으면 answer를 “NO”로 변경합니다.
  5. answer 값을 반환합니다.

주어진 매개변수 53, 93, 107을 대입하면 total은 253이 되고, 가장 큰 수는 107입니다. 따라서 total - max는 146이 되며, 107보다 작습니다. 따라서 함수는 “YES”를 반환합니다.

따라서 코드는 “YES”를 출력합니다.

3. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
8
9
10
{
        function solution(a, b, c){
                let answer;
                if(a < b) answer = a;
                else answer = b;
                if(c <= answer) answer = c; 
                return answer;
        }
        console.log(solution(15, 12, 11));
}

주어진 코드는 세 개의 숫자를 매개변수로 받아들여 가장 작은 수를 찾아 반환하는 함수입니다.

여기서는 15, 12, 11을 매개변수로 전달하여 함수를 호출하고 있습니다.

함수 내부를 살펴보겠습니다:

  1. answer 변수를 선언합니다. 이 변수는 초기값이 없습니다.
  2. 첫 번째와 두 번째 숫자를 비교하여 작은 값을 answer에 할당합니다.
  3. 세 번째 숫자와 answer를 비교하여 작거나 같은 값을 answer에 할당합니다.
  4. answer 값을 반환합니다.

주어진 매개변수 15, 12, 11을 대입하면, 먼저 15와 12를 비교하여 12가 더 작기 때문에 answer에 12가 할당됩니다. 그리고 11을 12와 비교하여 11이 12보다 작거나 같기 때문에 11이 12를 대체하게 됩니다. 따라서 함수는 11을 반환합니다.

따라서 코드는 11을 출력합니다.

4. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
8
9
10
11
12
{
        function solution(day, arr){
                let answer = 0;
                for(let x of arr){
                        if(x % 10 == day) answer++;
                }
                return answer;
        }
        
        arr = [25, 23, 11, 47, 53, 17, 33, 40];
        console.log(solution(0, arr));
}

주어진 코드는 특정한 숫자의 일의 자리가 특정한 숫자인 경우를 세는 함수입니다.

여기서는 day와 arr을 매개변수로 받아들여서 day로 나눈 나머지가 0인 arr의 원소의 개수를 반환하는 함수입니다.

주어진 arr은 [25, 23, 11, 47, 53, 17, 33, 40]입니다. day는 0입니다.

함수 내부를 살펴보겠습니다:

  1. answer 변수를 0으로 초기화합니다.
  2. 반복문을 통해 arr 배열의 각 원소 x를 순회합니다.
  3. 각 원소 x를 day로 나눈 나머지가 0인지 확인합니다.
  4. 나머지가 0이라면 answer를 1 증가시킵니다.
  5. 반복문이 종료된 후 answer 값을 반환합니다.

주어진 arr에서 day로 나눈 나머지가 0인 숫자는 40입니다. 따라서 함수는 1을 반환합니다.

따라서 코드는 1을 출력합니다.

5. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
{
        let a, b, result;
        a = 7, b = 4
        result = a & b;
    
        console.log(result);
}

주어진 코드는 비트 AND 연산자 &를 사용하여 변수 ab의 비트 AND 연산을 수행하고 결과를 result 변수에 할당한 후, result 변수의 값을 출력하는 것입니다.

여기서 ab는 각각 7과 4로 초기화됩니다. 이 값들은 7과 4의 이진수 표현에서 각 비트의 상태를 나타냅니다.

7은 이진수로 0111로 표현됩니다. 4는 이진수로 0100로 표현됩니다.

비트 AND 연산은 두 비트 모두가 1이어야만 결과도 1이 되고, 그렇지 않으면 0이 됩니다.

따라서 0111 & 0100을 계산하면 01110100의 각 비트를 AND 연산한 결과가 되며, 결과는 0100입니다. 이진수 0100을 십진수로 변환하면 4가 됩니다.

따라서 코드는 4를 출력합니다.

6. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
{
        let a = 6, b = 9, c = 3, result;
        result = ++a + b++ + ++c;
    
        console.log(result);
        console.log(a+b+c);
}

주어진 코드에서 resulta+b+c를 각각 계산하여 출력합니다.

  1. a는 6에서 1을 증가시켜 7이 됩니다.
  2. b는 9로 그대로이며 이후 1을 증가시켜 10이 됩니다.
  3. c는 3에서 1을 증가시켜 4가 됩니다.
  4. result++a + b++ + ++c를 계산하여 7 + 9 + 4로 20이 됩니다.
  5. a + b + c는 7 + 10 + 4로 21이 됩니다.

따라서 코드는 20과 21을 출력합니다.

주어진 코드는 다음과 같이 동작합니다.

  1. 변수 a에 6을 할당하고, 변수 b에 9를 할당하고, 변수 c에 3을 할당합니다.
  2. result 변수를 선언하고, ++a + b++ + ++c를 계산하여 결과를 할당합니다.
    • ++a: a를 1 증가시킨 후의 값인 7을 반환합니다.
    • b++: b의 현재 값인 9를 반환한 후, 1을 증가시킵니다.
    • ++c: c를 1 증가시킨 후의 값인 4를 반환합니다. 따라서 result에는 7 + 9 + 4로 계산된 20이 할당됩니다.
  3. a + b + c를 계산하여 출력합니다.
    • a인 7, b인 10, c인 4를 더하여 21이 됩니다.

따라서 코드는 20과 21을 출력합니다.

7. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
8
9
{
        let a, b = 10;

        for(let i=0; i<5; i++){
            a = i;
            b -= a;
        }
        console.log(a, b)
}

주어진 코드에서는 ab의 값이 반복문을 통해 변경됩니다.

처음에 b는 10으로 초기화되고, a는 초기화되지 않았으므로 undefined입니다.

반복문을 통해 a에는 0부터 4까지의 값이 차례대로 할당되고, b에서 a를 뺀 값이 b에 다시 할당됩니다.

따라서 반복문이 끝난 후의 a는 4이고, b는 10에서 0부터 4까지의 값을 뺀 값인 10 - 0 - 1 - 2 - 3 - 4 = 0이 됩니다.

그래서 코드는 4와 0을 출력합니다.

8. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
8
9
10
{
        let num = 10;
        num += 2;
        num -= 3;
        num *= 5;
        num /= 5;
        num %= 9;
        
        console.log(num)
}

주어진 코드는 변수 num에 순차적으로 연산을 수행하고, 그 결과를 출력합니다.

  1. num에 2를 더합니다. 따라서 num은 12가 됩니다.
  2. num에서 3을 뺍니다. 따라서 num은 9가 됩니다.
  3. num에 5를 곱합니다. 따라서 num은 45가 됩니다.
  4. num을 5로 나눕니다. 따라서 num은 9가 됩니다.
  5. num을 9로 나눈 나머지를 구합니다. 따라서 num은 0이 됩니다.

따라서 코드는 0을 출력합니다.

9. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
8
{
        let num = [1, 5, 1, 2, 7, 5];
        for(let i=0; i<6; i++){
            if((i+2) % 2 == 0){
                console.log(num[i]);
            }
        }
}

주어진 코드는 배열 num을 순회하면서 인덱스 i에 대해 (i+2) % 2 == 0인지 확인하고, 만족하는 경우 해당 인덱스의 값을 출력합니다.

처음에 i가 0일 때, (0+2) % 2는 2를 2로 나눈 나머지이므로 0이 됩니다. 따라서 num[0]인 1이 출력됩니다. 그 다음에 i가 1일 때, (1+2) % 2는 3을 2로 나눈 나머지이므로 1이 됩니다. 따라서 아무 값도 출력되지 않습니다. 그 다음에 i가 2일 때, (2+2) % 2는 4를 2로 나눈 나머지이므로 0이 됩니다. 따라서 num[2]인 1이 출력됩니다. 그 다음에 i가 3일 때, (3+2) % 2는 5를 2로 나눈 나머지이므로 1이 됩니다. 따라서 아무 값도 출력되지 않습니다. 그 다음에 i가 4일 때, (4+2) % 2는 6을 2로 나눈 나머지이므로 0이 됩니다. 따라서 num[4]인 7이 출력됩니다. 그 다음에 i가 5일 때, (5+2) % 2는 7을 2로 나눈 나머지이므로 1이 됩니다. 따라서 아무 값도 출력되지 않습니다.

따라서 코드는 1과 7을 출력합니다.

10. 다음을 보고 결괏값을 작성하시오!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
        let data = [10, 6, 7, 9, 3];
        let temp;
    
        for(let i=0; i<4; i++){
            for(let j=i+1; j<5; j++){
                if(data[i] > data[j]){
                    temp = data[i];
                    data[i] = data[j];
                    data[j] = temp;
                }
            }
        }
    
        console.log(data) 
}

주어진 코드는 배열 data의 요소들을 오름차순으로 정렬하는 버블 정렬 알고리즘을 구현한 것입니다.

처음에는 i가 0일 때, 내부 반복문에서 j는 1부터 4까지 변합니다. 이때 data[i]data[j]를 비교하여 data[i]가 더 크면 두 값을 교환합니다. 이러한 과정을 통해 매번 가장 작은 값이 배열의 왼쪽으로 이동합니다.

내부 반복문이 한 번 끝나면 배열의 맨 앞 요소에는 가장 작은 값이 위치하게 됩니다. 그 다음에는 i가 1일 때, 즉 배열의 두 번째 요소를 정렬하는 과정이 진행됩니다. 이 과정을 반복하여 배열의 모든 요소를 정렬합니다.

따라서 코드는 [3, 6, 7, 9, 10]을 출력합니다.

오늘도 필자의 부족한 글 읽어주셔서 감사합니다.

This post is licensed under CC BY 4.0 by the author.