코딩일기/자격증

[정보처리기사] [ C ] 삼항 연산자와 비트 연산자(시프트 연산자) 활용 | 2024년 1회 정보처리기사 실기 기출문제

jhy_2023 2025. 3. 25. 13:03
728x90
반응형

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칸 이동 : 001100100
    • 100 >> 2  0011001 (10진수: 25)

🔎 왼쪽 시프트(<<)

  • x << n : 왼쪽으로 n비트 이동 (곱하기 2^n과 동일)
  • a << n: 이진수를 왼쪽으로 n칸 이동합니다. 왼쪽으로 이동하면서 빈칸이 생기면, 뒤에 0이 채워집니다.
  • 이는 정수를 2의 n제곱으로 곱한 것과 동일합니다.
  • 예시 : 100 << 1 
    • 숫자 100 (2진수: 1100100 )을 왼쪽으로 1칸 이동 : 11001000
       100<< 1  11001000  (10진수: 200)
728x90

📌 문제 풀이

#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


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형