논리 연산자 문제, 등차수열 등비수열 문제
금요일 테스트 봤던 논리연산자 문제 하나와 등차,등비수열에 관한 문제 입니다.
우선 문제를 보기 전 논리연산자의 개념부터 알아보겠습니다.
논리연산자란?
논리 연산자는 불리언 값 (true 또는 false) 간의 연산을 수행하는 연산자입니다.
자바스크립트에서는 세 종류의 논리 연산자를 제공합니다.
1. && (and)
- 양쪽 피연산자가 모두 true 일 때 true를 반환합니다.
- 만약 어느 한 쪽이 false이면 false를 반환합니다.
- 예시: true && true는 true를 반환하고, true && false는 false를 반환합니다.
2. || (or)
- 양쪽 피연산자 중 하나라도 true이면 true를 반환합니다.
- 양쪽 피연산자가 모두 false일 때 false를 반환합니다.
- 예시: true || false는 true를 반환하고, false || false는 false를 반환합니다.
3. ! (not)
- 피연산자의 값을 반대로 뒤집어 반환합니다.
- true는 false로, false는 true로 바꾸어 반환합니다.
- 예시: !true는 false를 반환하고, !false는 true를 반환합니다.
논리연산 문제
//1번문제
{
let num1 = 3;
let num2 = 7;
if(++num1 < 5 || ++num2 > 8){
console.log(num1);
}
console.log(num2)
}
//2번문제
{
let num1 = 3;
let num2 = 7;
if(++num1 < 5 && ++num2 > 8){
console.log(num1);
}
console.log(num2)
}
우리의 (혹은 나만..?) 머리를 깨트렸던 문제입니다..
왜
1번 문제의 num2 는 7이고
2번 문제의 num2 는 8인가?!
1번 문제와 2번 문제는 논리 연산자를 사용하는 방법에서 차이가 있습니다!
1번 문제에서는 || (OR) 연산자를 사용하여 첫 번째 조건이 참이면 두 번째 조건을 평가하지 않고 조건문을 통과합니다.
따라서 ++num2는 실행되지 않고 7 그대로 유지됩니다.
하지만 만약에
{
let num1 = 3;
let num2 = 7;
if(++num1 < 4 || ++num2 > 8){
document.write(num1);
}
document.write(num2)
}
첫 번째 조건이 false가 되게끔 바꾸면 두번째 조건을 읽기 때문에 num2는 8이 될것입니다.
반면에 2번 문제에서는 & (AND) 연산자를 사용하여 두 개의 조건이 모두 참이어야 조건문을 통과합니다!
첫 번째 조건에서 ++num1은 4가 되어 조건을 만족하지 않습니다.
하지만 두 번째 조건에서 ++num2는 8이 되어 조건을 만족하게 됩니다.
그러므로 2번 문제에서는 num2가 8로 값이 증가한 상태로 출력됩니다.
논리연산자 문제에서 조건식을 다 읽냐, 다 못읽느냐를 잘 구분 하는것이 중요한거 같습니다..
등차,등비수열 문제
문제의 조건, 예시 입니다.
등차수열인지 등비수열인지 구별하여 배열의 다음 값이 무엇이 오는지 알아내는 문제입니다.
우선 등차수열, 등비수열이 무엇인지 알아야 합니다.
등차수열, 등비수열이란?
등차수열(arithmetic sequence)은 연속하는 두 항의 차이가 일정한 수열입니다.
즉, 첫째 항에서 둘째 항을 빼면, 둘째 항에서 셋째 항을 빼면, 이 값들이 모두 같아야 합니다.
예를 들어, 1, 3, 5, 7, 9, 11, ...은 등차수열이며, 각 항들 사이의 차이는 2입니다.
일반적으로 등차수열의 일반항은 다음과 같이 나타낼 수 있습니다.
등비수열(geometric sequence)은 연속하는 두 항의 비율이 일정한 수열입니다.
즉, 둘째 항을 첫째 항으로 나누면, 셋째 항을 둘째 항으로 나누면, 이 값들이 모두 같아야 합니다.
예를 들어, 2, 4, 8, 16, 32, ...은 등비수열이며, 각 항들 사이의 비는 2입니다.
일반적으로 등비수열의 일반항은 다음과 같이 나타낼 수 있습니다.
문제에서 배열(common)을 제시 해주며, [등차 수열]일때와 [등비 수열] 일때의 계산식을 두개 만들어 줘야 합니다.
우선 조건문을 써서 등차 수열인지 아닌지 구별부터 해줘야 할거같습니다.
if(common[1] - common[0] == common[2] - common[1]){ //등차수열 구하는 식
}
등차 수열은 각 배열과 배열사이의 차이가 일정하므로,
[배열 1번] - [배열 0번] 과
[배열 2번] - [배열 1번] 의 값은 똑같습니다!
예를 들어
const common[1, 4, 7, 10];
if(common[1] - common[0] == common[2] - common[1]){ //등차수열 구하는 식
}
//( 4 - 1 == 7 - 4 )
common 값을 줘서 보기 쉽게 예를 들어봤습니다.
조건문에서 등차수열인걸 확인했으면 제시된 배열(common) 에서
배열 마지막값 + 배열 첫번째값을 더해주면 문제에서 찾는 다음에 올 값을 구할 수 있습니다!
if(common[1] - common[0] == common[2] - common[1]){ //등차수열 구하는 식
answer = common.pop() + (common[1] - common[0]); //등차수열로 된 배열 다음에 올 값
}
[ pop( )은 배열에서 마지막 요소를 제거하고 그 값을 반환하는 JavaScript의 배열 메소드입니다! ]
배열의 마지막값을 가져와서 배열[1] - 배열[0] 을 해주어 차이를 구해주고 마지막값과 더하면 등차수열의 다음 값을 구할 수있습니다~
조건문의 true쪽인 등차수열을 알아봤으니 이제 false쪽은 등비수열이 되겠죠?
등비수열의 예를 들어,
[2, 4, 8, 16, 32]
//각 항들 사이의 비는 2
[5, 15, 45, 135]
//각 항들 사이의 비는 5
[10, 30, 60, 180]
//각 항들 사이의 비는 3
이런 느낌입니다~ 등차, 등비 개념만 알고 있으면 코드는 금방 짤 수 있겠네요!
등비수열은 배열[1] 을 배열[0] 로 나눠주면 항의 비를 구할 수 있습니다! 감이 오나요?
코드로 짜보자면,
if(common[1] - common[0] == common[2] - common[1]){ //등차수열 구하는 식
answer = common.pop() + (common[1] - common[0]); //등차수열로 된 배열 다음에 올 값
} else {
answer = (common[1] / common[0]) * common.pop(); //등비수열로 된 배열 다음에 올 값
}
배열[1] 을 배열[0]로 나눠주면 항의 비를 구하고 그 값을 배열 마지막값과 곱하면
등비수열로 된 배열 다음에 올 값을 구할수 있겠네요!!
[ 테스트를 실행하여 통과한 모습! 뿌-듯 ]
처음에 등차수열과 등비수열을 정확한 개념을 몰라서 헤맷지만 정확히 공부하고 나니까
문제를 수월하게 풀 수 있었어요!
봐주셔서 감사합니다~