클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

연산자 응용 2 - 관계 · 논리 · 비트 연산자 코딩테스트 문제 본문

알고리즘 및 자료 관리/알고리즘

연산자 응용 2 - 관계 · 논리 · 비트 연산자 코딩테스트 문제

huenuri 2024. 8. 25. 10:43

이제 아침 프로그래밍 시간이 얼마 남지 않았다. 마지막 문제로 관계 · 논리 · 비트 연산자를 활용한 문제를 풀어보려고 한다.

비슷한 유형의 문제들이 많아서 몇 개로 간추려서 정리해볼 것이다.


 

 

관계 연산자 <1137번>

관계연산자 3

 

관계연산자 3

두 정수(a, b)를 입력받아 a와 b가 같으면 0, 같지 않으면 1을 출력하는 프로그램을 작성하시오. 참고) 어떤 값을 비교하기 위해 비교/관계연산자(comparison/relational)를 사용할 수 있다. 관계연산자는

codeup.kr

 

문제 1번

두 정수(a, b)를 입력받아 a와 b가 같으면 0, 같지 않으면 1을 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main(void)
{
	int a, b;
	scanf_s("%d%d", &a, &b);
	printf("%d", a != b);

	return 0;
}

 

문제에서 같으면 0, 같지 않으면 1이 출력되므로 1이 출력되었다. 1번과 2번 관계연산자 문제는 비슷해서 1개만 다시 풀어보았다.


 

논리 연산자(NOT) <1138번>

논리 연산자(NOT)

 

논리 연산자(NOT)

1(true, 참) 또는 0(false, 거짓) 이 입력되었을 때 결과를 반대로 출력하는 프로그램을 작성해보자. 참고) C언어에서 비교/관계 연산(==, !=, >, <, >=, <=)이 수행될 때, 0은 거짓(false)을 의미하고, 0이 아

codeup.kr

 

문제 2번

1(true, 참) 또는 0(false, 거짓) 이 입력되었을 때 결과를 반대로 출력하는 프로그램을 작성해보자.
0또는 1이 입력된다.
입력된 논리값의 반대로 출력한다.

#include <stdio.h>

int main(void)
{
	int a;
	scanf_s("%d", &a);
	printf("%d", !a);

	return 0;
}

 

1번 문제와 다른 점은 하나의 숫자(참 또는 거짓)가 입력되고 그것과 반대되는 값이 출려된다는 것이다.
여기서는 관계연산자가 아닌 논리연산자를 사용해야 한다.

이 둘의 차이를 꼭 기억하자!


 

 

논리 연산자(AND) <1139번>

논리 연산자(AND)

 

논리 연산자(AND)

두 가지의 참(1) 또는 거짓(0)이 입력될 때, 모두 참일 때는 1이, 그렇지 않으면 0이 출력되는 프로그램을 작성해보자. 참고) 논리연산자 && 는 주어진 2개의 논리값이 모두 참(1) 일 때에 1(참)으로

codeup.kr

 

문제 3번

두 가지의 참(1) 또는 거짓(0)이 입력될 때, 모두 참일 때는 1이, 그렇지 않으면 0이 출력되는 프로그램을 작성해보자.

#include <stdio.h>

int main(void)
{
	int a, b;
	scanf_s("%d%d", &a, &b);
	printf("%d", a && b);

	return 0;
}

 

3번 문제에서는 참일 때는 1, 그렇지 않으면 0이 출력되어야 하므로 and 연산임을 알 수 있다.
&&를 사용하는데 &과 혼동해서는 안된다. &는 뒤에 나오는 비트연산자과 연관이 있다.


 

 

비트 연산자(OR) <1144번>

비트 연산자(OR)

 

비트 연산자(OR)

두 수를 입력받아 비트단위로 OR연산한 후 결과를 출력하시오. 참고) 비트연산자 | 은 주어진 2개의 값을 2진법으로 변환한 뒤, 비트별로 OR 연산을 수행한 뒤 결과를 출력한다. 이러한 비트 연산

codeup.kr

 

문제 4번

두 수를 입력받아 비트단위로 OR연산한 후 결과를 출력하시오.

#include <stdio.h>

int main(void)
{
	int a, b;
	scanf_s("%d%d", &a, &b);
	printf("%d", a | b);

	return 0;
}

3과 5에서 or 연산을 하면 7이 나온다.


 

 

비트 연산자(<<) <1147번>

비트 연산자(<<)

 

비트 연산자(<<)

두 정수 a, x입력.(1<=a<=100,000 , 1<=x<=10)

codeup.kr

 

문제 5번

정수 a, x를 입력받아 a의 값을 x만큼 SHIFT(<<) 연산한 후 결과를 출력하시오.

#include <stdio.h>

int main(void)
{
	int a, x;
	scanf_s("%d%d", &a, &x);
	printf("%d", a << x);

	return 0;
}

 

왼쪽 시프트 연산을 했으니 값이 더 커지고, 오른쪽 시프트 연산을 하면 값이 작아진다.

두 개의 연산은 좀 헤깔리기도 하는데, 머리가 어느쪽을 향해 있는지 보면 파악할 수 있다. 왼쪽 시프트 연산은 끝 부분이 왼쪽을 향하고 있고, 오른쪽은 그 반대의 경우이다.


 

 

오늘의 세번째 단원 코딩 학습을 마치고

 

이렇게 해서 오늘 풀려고 했던 3가지 주제별로 코딩 테스트 문제를 풀어보았다. 마지막 주제의 문제가 남아있지만 이건 내일이나 다음에 학습해보려고 한다.

이제 관계 · 논리 · 비트 연산자를 어려워하지 않고 잘 구분할 수 있게 되었다~