2024년 1회 정보처리기사 실기 기출문제
문제
다음 C 코드의 실행 결과를 구하시오.
#include <stdio.h>
int main() {
int v1 = 0, v2 = 35, v3 = 29;
if(v1 > v2 ? v2 : v1) {
v2 = v2 << 2;
}else{
v3 = v3 << 2;
}
printf("%d", v2+v3);
}
정답
151
해설
📌 기본 개념
1️⃣ 삼항 연산자 (?:)
조건식 ? 참일 때 값 : 거짓일 때 값;
- 삼항 연산자는 조건에 따라 두 개의 값 중 하나를 선택하는 연산자입니다.
#include <stdio.h>
int main() {
int a = 10, b = 20;
int max = (a > b) ? a : b; // a가 b보다 크면 a, 아니면 b 선택
printf("최댓값: %d\n", max); // 출력: 최댓값: 20
}
- a > b가 거짓(false) 이므로 b가 선택됩니다.
- 결과적으로 max = 20이 됩니다.
2️⃣ 비트 연산자
비트 연산자는 비트 단위(bitwise) 연산을 수행하는 연산자로, 문제에서 사용된 시프트 연산자도 여기에 포함됩니다.
🔸 시프트 연산 예제
시프트 연산은 이진수를 왼쪽(<<) 또는 오른쪽(>>)으로 이동시키는 연산입니다. 먼저 2진수로 변환하는 방법에 대해 알아보겠습니다.
[ 1 ] 10진수를 2진수로 변환 하기
컴퓨터는 모든 데이터를 2진수(0과 1)로 처리합니다.
예를 들어, 숫자 5는 2진수로 101, 숫자 10은 1010입니다.
🔎 예시:
10진수를 2진수로 변환하려면, 10진수를 계속 2로 나누어 나머지를 기록하고, 나머지를 거꾸로 읽으면 2진수가 됩니다.
숫자 10을 2진수로 바꿔보겠습니다.
- 10 ÷ 2 = 5 (나머지 0) → 첫 번째 나머지는 0
- 5 ÷ 2 = 2 (나머지 1) → 두 번째 나머지는 1
- 2 ÷ 2 = 1 (나머지 0) → 세 번째 나머지는 0
- 1 ÷ 2 = 0 (나머지 1) → 네 번째 나머지는 1
- 나누기를 종료하는 조건은 몫이 0이 될 때입니다. 이제 나머지를 거꾸로 읽으면 2진수가 됩니다.
- 나머지를 위에서 아래로 읽으면: 0, 1, 0, 1 > 나머지를 아래에서 위로 읽으면: 1010 (2진수)
즉, 10진수 10은 2진수로 1010입니다.
[ 2 ] 2진수를 10진수로 변환 하기
2진수를 10진수로 변환하려면 2진수의 각 자리 값을 2의 거듭제곱으로 계산한 뒤 모두 더하면 됩니다.
[ 3 ] 시프트 연산
시프트 연산은 이진수를 왼쪽(<<) 또는 오른쪽(>>)으로 이동시키는 연산입니다.
🔎 오른쪽 시프트(>>)
- x >> n : 오른쪽으로 n비트 이동 (정수형에 따라 다름)
- a >> n: 이진수를 오른쪽으로 n칸 이동합니다. 오른쪽으로 이동하면서 빈칸이 생기면, 앞쪽에 0이 채워집니다(양수 기준).
- 이는 정수를 2의 n제곱으로 나눈 것과 동일합니다.
- 예시 : 100 >> 2
- 숫자 100 (2진수: 1100100)을 오른쪽으로 2칸 이동 : 0011001
00 - 100 >> 2 → 0011001 (10진수: 25)
- 숫자 100 (2진수: 1100100)을 오른쪽으로 2칸 이동 : 0011001
🔎 왼쪽 시프트(<<)
- x << n : 왼쪽으로 n비트 이동 (곱하기 2^n과 동일)
- a << n: 이진수를 왼쪽으로 n칸 이동합니다. 왼쪽으로 이동하면서 빈칸이 생기면, 뒤에 0이 채워집니다.
- 이는 정수를 2의 n제곱으로 곱한 것과 동일합니다.
- 예시 : 100 << 1
- 숫자 100 (2진수: 1100100 )을 왼쪽으로 1칸 이동 : 11001000
100<< 1 → 11001000 (10진수: 200)
- 숫자 100 (2진수: 1100100 )을 왼쪽으로 1칸 이동 : 11001000
📌 문제 풀이
#include <stdio.h>
int main() {
int v1 = 0, v2 = 35, v3 = 29;
if(v1 > v2 ? v2 : v1) {
v2 = v2 << 2;
}else{
v3 = v3 << 2;
}
printf("%d", v2+v3);
}
1️⃣ 삼항 연산자
if(v1 > v2 ? v2 : v1)
- v1 > v2는 0 > 35이므로 거짓(false)
- 삼항 연산자는 거짓일 때 값을 선택 → v1 = 0이 선택됨
- 따라서 if(0)이 되어, 조건문은 false
- 띠리사 else 블록이 실행됨
2️⃣ else 블록 실행
v3 = v3 << 2;
- v3 = 29
- 방법1) 29 << 2 → 29 * 2^2 = 29 * 4 = 116
- 방법2) 29 → 00011101 (2진수)
- 00011101 << 2 → 01110100 (2진수)
- 왼쪽으로 2칸 이동하면서 오른쪽에 0이 채워짐
- 즉, 00011101 (29) → 01110100 (10진수: 116)
- 따라서 v3 = 116
[참고 문제]
2025.01.21 - [코딩일기/자격증] - [정보처리기사] [ Python ] for ... in 반복문과 range() 함수 | 시프트 연산 | 정보처리기사 실기 기출문제\
[정보처리기사] [ Python ] for ... in 반복문과 range() 함수 | 시프트 연산 | 정보처리기사 실기 기출문
2021년 2회 정보처리기사 실기 기출문제문제다음 파이썬 프로그램의 실행결과를 쓰시오a = 100result = 0for i in range(1,3): result = a >> i result = result + 1print(result)정답26해설 📌 for ... in 문 for ... in 문은
august-jhy.tistory.com
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
'코딩일기 > 자격증' 카테고리의 다른 글
[정보처리기사] 서브넷과 서브넷 마스크 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.03.27 |
---|---|
[정보처리기사] [ C ] 문자열 역순 출력 | 2024년 1회 정보처리기사 실기 기출문제 (0) | 2025.03.25 |
[정보처리기사] [Java] static 변수와 메서드 | 싱글톤 패턴 | 정보처리기사 실기 기출문제(2024년 1회) (0) | 2025.03.23 |
[정보처리기사] [Java] static 변수와 메서드 이해 | 싱글톤 패턴 활용 | 정보처리기사 실기 기출문제(2021년 3회) (0) | 2025.03.23 |
[정보처리기사] [Java] 논리 연산자를 활용한 조건문 분석 | 연산자 우선순위 | 정보처리기사 실기 기출문제 (0) | 2025.03.23 |