알고리즘 문제 간단 정리 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 연산자 |
를 사용하여 변수 a
와 b
의 비트 OR 연산을 수행하고 결과를 result
변수에 할당한 후, result
변수의 값을 출력하는 것입니다.
여기서 a
와 b
는 각각 7과 4로 초기화됩니다. 이 값들은 7과 4의 이진수 표현에서 각 비트의 상태를 나타냅니다.
7은 이진수로 0111
로 표현됩니다. 4는 이진수로 0100
로 표현됩니다.
비트 OR 연산은 두 비트 중 하나 이상이 1이면 결과도 1이 되고, 그렇지 않으면 0이 됩니다.
따라서 0111 | 0100
을 계산하면 0111
과 0100
의 각 비트를 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을 매개변수로 전달하여 함수를 호출하고 있습니다.
함수 내부를 살펴보겠습니다:
answer
변수를 “YES”로 초기화합니다.- 세 수의 합을 계산하여
total
변수에 저장합니다. a
,b
,c
중에서 가장 큰 수를 찾아max
변수에 저장합니다.- 세 수의 합에서 가장 큰 수를 뺀 값이 가장 큰 수와 같거나 작으면
answer
를 “NO”로 변경합니다. 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을 매개변수로 전달하여 함수를 호출하고 있습니다.
함수 내부를 살펴보겠습니다:
answer
변수를 선언합니다. 이 변수는 초기값이 없습니다.- 첫 번째와 두 번째 숫자를 비교하여 작은 값을
answer
에 할당합니다. - 세 번째 숫자와
answer
를 비교하여 작거나 같은 값을answer
에 할당합니다. 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입니다.
함수 내부를 살펴보겠습니다:
answer
변수를 0으로 초기화합니다.- 반복문을 통해 arr 배열의 각 원소 x를 순회합니다.
- 각 원소 x를 day로 나눈 나머지가 0인지 확인합니다.
- 나머지가 0이라면
answer
를 1 증가시킵니다. - 반복문이 종료된 후
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 연산자 &
를 사용하여 변수 a
와 b
의 비트 AND 연산을 수행하고 결과를 result
변수에 할당한 후, result
변수의 값을 출력하는 것입니다.
여기서 a
와 b
는 각각 7과 4로 초기화됩니다. 이 값들은 7과 4의 이진수 표현에서 각 비트의 상태를 나타냅니다.
7은 이진수로 0111
로 표현됩니다. 4는 이진수로 0100
로 표현됩니다.
비트 AND 연산은 두 비트 모두가 1이어야만 결과도 1이 되고, 그렇지 않으면 0이 됩니다.
따라서 0111 & 0100
을 계산하면 0111
과 0100
의 각 비트를 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);
}
주어진 코드에서 result
와 a+b+c
를 각각 계산하여 출력합니다.
a
는 6에서 1을 증가시켜 7이 됩니다.b
는 9로 그대로이며 이후 1을 증가시켜 10이 됩니다.c
는 3에서 1을 증가시켜 4가 됩니다.result
는++a + b++ + ++c
를 계산하여 7 + 9 + 4로 20이 됩니다.a + b + c
는 7 + 10 + 4로 21이 됩니다.
따라서 코드는 20과 21을 출력합니다.
주어진 코드는 다음과 같이 동작합니다.
- 변수
a
에 6을 할당하고, 변수b
에 9를 할당하고, 변수c
에 3을 할당합니다. result
변수를 선언하고,++a + b++ + ++c
를 계산하여 결과를 할당합니다.++a
:a
를 1 증가시킨 후의 값인 7을 반환합니다.b++
:b
의 현재 값인 9를 반환한 후, 1을 증가시킵니다.++c
:c
를 1 증가시킨 후의 값인 4를 반환합니다. 따라서result
에는 7 + 9 + 4로 계산된 20이 할당됩니다.
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)
}
주어진 코드에서는 a
와 b
의 값이 반복문을 통해 변경됩니다.
처음에 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
에 순차적으로 연산을 수행하고, 그 결과를 출력합니다.
num
에 2를 더합니다. 따라서num
은 12가 됩니다.num
에서 3을 뺍니다. 따라서num
은 9가 됩니다.num
에 5를 곱합니다. 따라서num
은 45가 됩니다.num
을 5로 나눕니다. 따라서num
은 9가 됩니다.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]
을 출력합니다.
오늘도 필자의 부족한 글 읽어주셔서 감사합니다.