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

연산자 2 - 비교연산과 논리연산 코딩테스트 <코드업> 본문

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

연산자 2 - 비교연산과 논리연산 코딩테스트 <코드업>

huenuri 2024. 8. 25. 01:04
다음 문제는 비트시프트 연산 문제가 있지만 문제가 2문제 밖에 없어 다른 문제와 함께 풀어보려고 한다.

이제 비교연산과 논리연산 문제를 풀어볼 차례이다. 두 수를 비교하고 참과 거짓을 판단하는 문제들이다.

여기서는 &&, || 같은 기호가 중요하다. 하나만 있을 때는 논리이고, 두 개 있을 때 비교이니 이 점도 주의해야 한다.
처음에는 이 부분이 많이 헤깔렸다. 지금도 자주 틀리는 문제이기도 하다.



 

 

문제 1번 <1049번>

 

두 정수 입력받아 비교하기1

두 정수(a, b)를 입력받아 a가 b보다 크면 1을, a가 b보다 작거나 같으면 0을 출력하는 프로그램을 작성해보자.

#include <stdio.h>

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

	return 0;
}

 

9는 1보다 크므로 1이 출력되었다. 어떤 것이 참인지 판단한 후 그에 관한 식을 만들면 된다.



 

 

문제 2번 <1052번>

 

두 정수 입력받아 비교하기4

두 정수(a, b)를 입력받아
a와 b가 서로 다르면 1을, 그렇지 않으면 0을 출력하는 프로그램을 작성해보자.

#include <stdio.h>

int main(void)
{
	int a, b;

	scanf_s("%d%d", &a, &b);
	printf("%d", a != b);

	return 0;
}

 

2와 3은 다르니 1이 출력되었다. 같다는 기호는 ==이고, 다르다는 기호는 !=이다. =와 다름을 꼭 기억하자.
=는 대입연산에 사용하는 기호이다.



 

문제 3번 <1053번>

 

참 거짓 바꾸기

1(true, 참) 또는 0(false, 거짓) 이 입력되었을 때 반대로 출력하는 프로그램을 작성해보자.

#include <stdio.h>

int main(void)
{
	int a;

	scanf_s("%d", &a);
	printf("%d", !a);

	return 0;
}

 

참은 1이므로 1을 0으로 만들면 된다. 반대로 바꾸는 기호는 !을 한개만 사용한다.
=!과 헤깔리는데 이 기호는 서로 비교를 할 때 다르다이고, !는 비교할 대상이 없이 그냥 바꾸는 것 같다.



 

문제 4번 <1055번>

 

하나라도 참이면 참 출력하기

두 개의 참(1) 또는 거짓(0)이 입력될 때,
하나라도 참이면 참을 출력하는 프로그램을 작성해보자.

#include <stdio.h>

int main(void)
{
	int a, b;

	scanf_s("%d%d", &a, &b);
	printf("%d", a || b);

	return 0;
}

 

하나라도 참일 때는 ||을, 모두 참일 때는 &&을 사용한다.



 

 

문제 5번 <1056번>

 

참/거짓이 서로 다를 때에만 참 출력하기

두 가지의 참(1) 또는 거짓(0)이 입력될 때,
참/거짓이 서로 다를 때에만 참을 출력하는 프로그램을 작성해보자.

#include <stdio.h>

int main(void)
{
	int a, b;

	scanf_s("%d%d", &a, &b);
	printf("%d", (a && !b)||(!a && b));

	return 0;
}

 

여기서부터는 문제가 좀 어려워진다. a와 b가 참, 거짓이 다를 때가 언제인지 생각해봐야 한다. a, b에 각각 반대의 경우가 !붙을 경우를 다르다고 할 수 있을 것 같다.
한 개의 경우만 쓰면 a가 거짓이고, b가 참일 때의 조건이 성립하지 않아 두 개를 함께 써야 한다.



 

문제 6번 <1057번>

 

참/거짓이 서로 같을 때에만 참 출력하기

두 개의 참(1) 또는 거짓(0)이 입력될 때,
참/거짓이 서로 같을 때에만 참이 계산되는 프로그램을 작성해보자.

#include <stdio.h>

int main(void)
{
	int a, b;

	scanf_s("%d%d", &a, &b);
	printf("%d", (!a && !b) || (a && b));

	return 0;
}

 

6번 문제도 좀 난이도가 있다. 참, 거짓이 서로 같으려면 그냥 a, b와 서로 반대의 경우인 a, b가 모두 같아야 한다.



 

문제 7번 <1058번>

 

둘 다 거짓일 경우만 참 출력하기

두 개의 참(1) 또는 거짓(0)이 입력될 때,
모두 거짓일 때에만 참이 계산되는 프로그램을 작성해보자.

#include <stdio.h>

int main(void)
{
	int a, b;

	scanf_s("%d%d", &a, &b);
	printf("%d", (!a && !b) || !(a || b));

	return 0;
}

 

중요한 문제라서 모두 풀어보았다. 7번 문제는 둘다 거짓일 경우에 출력을 하는 것이다. 둘다 거짓이 되려면 a, b가 모두 반대가 되어야 하고, 그냥 a, b의 값도 거짓이라는 표시를 해주어야 성립한다.



 

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

이번에 푼 문제는 상당히 많다. 보통 한 페이지에 5문제 이내로 기록하려고 하는데, 비슷한 문제가 이어져 모두 풀어보았다.
마지막의 세 문제는 좀 헤깔려서 다음에 한번 더 풀어보려고 한다.

이제 두 개의 단원이 남아있는데, 오늘 다 하기는 힘들고 한 개만 더 풀어보고 코딩 학습을 마쳐볼 생각이다~