코딩테스트

우리가 헷갈린 논리연산자 증감식과 등차수열, 등비수열 문제 풀어보기!

김도현2 2023. 3. 26. 23:12
반응형

논리 연산자 문제, 등차수열 등비수열 문제

금요일 테스트 봤던 논리연산자 문제 하나와 등차,등비수열에 관한 문제 입니다.

 

우선 문제를 보기 전 논리연산자의 개념부터 알아보겠습니다.

 

 

논리연산자란?

논리 연산자는 불리언 값 (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]로 나눠주면 항의 비를 구하고 그 값을 배열 마지막값과 곱하면 

등비수열로 된 배열 다음에 올 값을 구할수 있겠네요!!

 

 

[ 테스트를 실행하여 통과한 모습! 뿌-듯 ]

 

 

처음에 등차수열과 등비수열을 정확한 개념을 몰라서 헤맷지만 정확히 공부하고 나니까
문제를 수월하게 풀 수 있었어요!
봐주셔서 감사합니다~