"/>

코드업 기초 – [기초-비트단위논리, 삼항연산]1059~1064번까지 해설,정답

-오픈튜토리얼스에서 배우기-

-처음부터 풀기-

1059 : [기초-비트단위논리연산] 비트단위로 바꿔 출력하기

문제 설명

입력 된 정수를 비트단위로 참/거짓을 바꾼 후 정수로 출력해보자.

입력

정수 1개가 입력된다.
(-2147483648 ~ +2147483647)

출력

비트 단위로 1->0, 0->1로 바꾼후 그 값을 10진수로 출력한다.

입력 예시

2

출력 예시

-3

문제 해설 

복습해보자!

정답

#include<stdio.h>
int main()
{
int a;
scanf(“%d”, &a);
printf(“%d”, ~a);
return 0;
}

1060 : [기초-비트단위논리연산] 비트단위로 and 하여 출력하기

문제 설명

입력 된 정수 두 개를 비트단위로 and 연산한 후 그 결과를 정수로 출력해보자.

입력

두 개의 정수가 공백을 두고 입력된다.
(-2147483648 ~ 2147483647)

출력

두 정수를 비트단위로 and 계산을 수행한 결과가 10진수로 출력된다.

입력 예시

3 5

출력 예시

1

문제 해설

논리곱(AND, &)
두 값의 각 자릿수를 비교해, 두 값 모두에 1이 있을 때에만 1을, 나머지 경우에는 0을 계산한다.(1100(십진수10)과 1010(“12)을 비교할때, 1000(“8)이 된다. )

정답

#include<stdio.h>
int main()
{
int a,b;
scanf(“%d %d”, &a, &b);
printf(“%d”, a&b);
return 0;
}

1061 : [기초-비트단위논리연산] 비트단위로 xor 하여 출력하기

문제 설명

입력 된 정수 두 개를 비트단위로 xor 연산한 후 그 결과를 정수로 출력해보자.

입력

두 개의 정수가 공백을 두고 입력된다.
(-2147483648 ~ 2147483647)

출력

두 정수를 비트단위로 xor 계산을 수행한 결과가 10진수로 출력된다.

입력 예시

3 5

출력 예시

6

문제 해설

배타적 논리합(XOR, ^)
두 값의 각 자릿수를 비교해,값이 0으로 같으면 0, 값이 1로 같아도 0, 다르면 1을 계산한다.
(1100(십진수10)과 1010(“12)을 비교할때 0110(“6)이 된다.)

정답

#include<stdio.h>
int main()
{
int a,b;
scanf(“%d %d”, &a, &b);
printf(“%d”, a^b);
return 0;
}

1062 : [기초-비트단위논리연산] 비트단위로 or 하여 출력하기

문제 설명

입력 된 정수 두 개를 비트단위로 or 연산한 후 그 결과를 정수로 출력해보자.

입력

두 개의 정수가 공백을 두고 입력된다.
(-2147483648 ~ 2147483647)

출력

두 개의 정수가 공백을 두고 입력된다.
(-2147483648 ~ 2147483647)

입력 예시

3 5

출력 예시

7

문제 해설

논리합(OR, |)
두 값의 각 자릿수를 비교해, 둘 중 하나라도 1이 있다면 1을, 아니면 0을 계산한다.
(1100(십진수10)과 1010(“12)을 비교할때 1110(“14)이 된다. )

정답

#include<stdio.h>
int main()
{
int a,b;
scanf(“%d %d”, &a, &b);
printf(“%d”, a|b);
return 0;
}

1063 : [기초-삼항연산] 두 정수 입력받아 큰 수 출력하기

문제 설명

입력된 두 정수 a, b 중 큰 값을 출력하는 프로그램을 작성해보자.
(단, 조건문을 사용하지 않고 3항 연산자 ? 를 사용한다.)

입력

두 정수가 공백을 두고 입력된다.
(-2147483648 ~ 2147483647)

출력

큰 값이 10진수로 출력된다.

입력 예시

123 456

출력 예시

456

정답

#include<stdio.h>
int main()
{
int a,b;
scanf(“%d %d”, &a, &b);
printf(“%d”, a>b ? a:b);
return 0;
}

1064 : [기초-삼항연산] 정수 세 개 입력받아 가장 작은 수 출력하기

문제 설명

입력된 세 정수 a, b, c 중 가장 작은 값을 출력하는 프로그램을 작성해보자.
(단, 조건문을 사용하지 않고 3항 연산자 ? 를 사용한다.)

입력

세 개의 정수가 공백으로 구분되어 입력된다.
(-2147483648 ~ 2147483648)

출력

가장 작은 값이 출력된다.

입력 예시

1 2 3

출력 예시

1

문제 해설(코드업 도움말)

C언어 소스코드 작성시 모든 요소들은
“순서에 따라 한 단계씩 실행”
“미리 정해진 순서에 따라 하나씩 연산 수행” <- 사칙연산계산시 */먼저 나중에+-처럼
“연산된 결과를 이용해 다시 순서에 따라 하나씩 연산”

등의 원리가 적용된다.

따라서 3항 연산자 ?를 중첩해(괄호로 묶는 등..) 이용하면

여러 값들을 순서대로 비교해 가장 큰/작은 값을 계산할 수 있다.

예를 들어

(a>b ? a:b)>c ? (a>b ? a:b):c
의 계산식은 a, b, c 의 값 중 가장 큰 값으로 계산된다.

잘 이해가 되지 않는다면 어떤 순서에 따라 계산될지 생각해보고

여러가지 연산자가 동시에 여러개 사용된 식이 있을 때,

어떤 우선순위에 따라 순서대로 계산이 되는지 스스로 찾아보도록 한다.

연산자 우선순위“를 검색하면 우선순위와 결합방향이 나온다.

예를 들어 변수에 어떤 값을 대입하는 대입(assign) 연산자 = 의 우선순위는

가장 낮고, 오른쪽에서 왼쪽의 결합방향을 가진다.

따라서,

a = b = c = d = e = f = g = h = i = j = 0;

의 식을 실행하면.. 오른쪽에서 부터 왼쪽으로 가면서..

처음에 j 변수에 0이 대입되고,
다음에 i 변수에 j변수에 저장되어있는 값이 저장되고,
그 다음에 h 변수에 i변수에 저장되어있는 값이 저장되고,

결국 모든 변수의 값을 0으로 만드는 결과가 된다.

** 3항 연산자는 자주 사용되지는 않지만, 복잡한 계산식이나 조건처리, 비교구조를 매우 간단히 표현할 수 있게 해준다.

잘 사용해보면 나름대로의 재미와 묘미가 있는 연산자이다.

특히, 보다 짧은 코드로 문제를 해결하려고하는 숏코딩(coding)에서는 빠질 수 없는 요소이다.

각 문제 페이지의 아래쪽에 통계(statistics)를 눌러보면, 문제를 해결하는데 사용한 코드의 총 문자수가 숫자로 표시된다.

“똑같이 해결할 수 있는 프로그램이지만, 때로는 아주 적은 소스코드 양으로 풀어내는 것을 매우 즐기는 숏코더들이 있다.”

숏코딩은 일종의 재미이기는 하지만, 프로그래밍언어의 밑바닥 기초, 세세한 처리과정에 대한 이해,

컴파일러의 소스코드 해석과 변환 등에 대한 경험과 지식이 필요하다.

정답

#include<stdio.h>
int main()
{
int a,b,c;
scanf(“%d %d %d”, &a, &b, &c);
printf(“%d”, (a<b ? a:b)<c ? (a<b ? a:b):c);
return 0;
}

 

-조건문 배우기-

만약 배웠다면?

이어서 문제 풀기

 

댓글 남기기

Scroll Up