본문 바로가기
알고리즘 풀이

C++ 오답 노트

by yeni_0224 2025. 3. 30.
728x90
반응형

느낌으로 얻어버린 CS를 뜯어고치느라 머릿속이 과열되고 있지만 감사한 마음으로 공부하고있다.

결혼준비 하면서 수학공부하면서 CS 공부하면서 C++과 유니티를 하면서 복습해야되는데 결혼준비와 아픔을 핑계로 복습은 거리가 멀어지는 듯 하다. 아직도 몸이 힘들고, 트라우마로 인해서 뇌가 굳어있다. 말 그대로 아직 정상적인, 단순한 사고도 하기 어렵다. 그래도 치료도 꾸준히 받으면서, 악바리로 열심히 하려고 최선을 다하고 있다. 이렇게 직장에서의 트라우마를 이겨낼 수 있을거라 스스로를 믿고 있다. 지금이 재밌다. 명확한 답을 들을 수 있어서..

업무도 그렇게 명확한 답을 들었다면 참 좋았을텐데

 

게임인재원에서 시험을 보았다. 점수는 처참했지만 그래도 좋았다. 앞으로 채워나가면 되는 거니까.

 

1. 출력 결과 : 컴파일 오류

괄호 안의 정의를 주석처리해도 오류 발생, 괄호 외의 정의 중 하나만 지우면 출력 됨

#include <iostream>


int main()
{
    int n = 0;
    std::cout << n << std::endl;
    {
        int n = 1;
        std::cout << n << std::endl;
    }

    short n = 2;
    std::cout << n << std::endl;

    return 0;
}

 

2. 출력값 : 10

sum을 출력할 때는 5가 아닌 4부터 계산되기 시작한다.

#include <iostream>

int main()
{
   int count = 5;
   int sum = 0;
   while (count--)
   {
       sum += count;
   }
   std::cout << sum << std::endl;

    return 0;
}

 

3. 출력값 : 2

>>= 연산자를 어떻게 봐야하나 고민했다. +=와 같은 맥락이다. 비트 연산으로 밀어낸 값을 저장하는 것. 추측이므로 추후 확인이 필요하다.(확답을 얻으면 수정할 것)

#include <iostream>

int main()
{
    int count = 4;
    int n = 0;
    while (count >>= 1)
    {
        ++n;
    }
    std::cout << n << std::endl;

    return 0;
}

 

4. 코드 결과는 ? gVal is false 출력

gVal이 메인 밖에서 선언된다. 반 학우들 말에 의하면 값을 저렇게 지정하지 않으면 기본적으로 변수에 0이 할당된다고 했다.

그런데 생각해보면 gVal에 1이 할당 된 것도 아니고, 정확한 값을 지정하여 정의한것도 아닌데 true가 출력될 리가 없다. 근데 이제 컴파일 에러를 생각했던 이유는 전에 단순 로직에서 변수에 값을 정의하지 않고 디버깅 했을 때 오류가 뜬 적이 있어서다. 내가 잘못했겠지뭐.. 그래서 쓰레기 값이 gVal에 할당될 것이기 때문에 에러가 날거라고 생각했다.

#include <iostream>

int gVal;
int main()
{
    if (gVal)
    {
        std::cout << "gVal is true" << std::endl;
    }
    else
    {
        std::cout << "gVal is false" << std::endl;
    }
    return 0;
}

 

5. 출력 결과 : infinite loop

printf로 출력할 때 -- 연산자를 쓰면 계산값이 출력되는건 알고 있지만 변수 값이 업데이트가 나 한번도 해본적이 없어서 몰랐다. 그런데 n이 0이 될 수 있을거라 생각하면서 홀수값만 출력될 것이라 생각하는 이 모순은 어떤 발상인가..멍청해라

#include <stdio.h>

int main()
{
    for (int n = 9; n != 0; n--)
    {
        printf("n = %d", n--);
    }
    return 0;
}

 

6.출력 결과 : 참 : 1

논리연산자인건 알고 있었다. ||는 왼쪽이 0이 아닌 값이면 오른쪽을 평가하지 않고 전체 표현식을 참으로 인식한다고 말씀하셨던 걸 이제서야 기억해내는 나는 일단 비교하고 보았다. 아직도 인간의 뇌로 판별한 것. a가 이미 1로 참이기 때문에 참이 출력되고, ++b는 연산 조차 안한다. 

너 함정에 빠져랏!  했을 때 옙! 하고 빠지는 나라고 비유할 수 있겠다.

#include <iostream>

int main()
{
    int a = 1;
    int b = 1;
    if (a || ++b)
    {
        std::cout << "참 : " << b << std::endl;
    }
    else
    {
        std::cout << "거짓 : " << b << std::endl;
    }
    return 0;
}

 

7. 출력 결과 : 참 : 2

&&는 양쪽 다 참이어야 괄호 안 연산으로 들어가기 때문에 참이고, 2가 출

#include <iostream>

int main()
{
    int a = 1;
    int b = 1;
    if (a && ++b)
    {
        std::cout << "참 : " << b << std::endl;
    }
    else
    {
        std::cout << "거짓 : " << b << std::endl;
    }
    return 0;
}

 

8. 출력 결과 : 3 2

왜그랬을까..? XOR 연산자인 것은 알았다. 비트연산자이기 때문에 저 값을 이진수로 바꾸어 비교해야했다. 십진수로만 생각해버린 나는 바보가 맞다. 이제 알았으니까 두번 실수하면 진짜 멍청한거다. (넵 맞습니다)

#include <stdio.h>

void Func(int*x, int* y)
{
    if(x == y) return;
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
}

int main()
{
   int x = 2;
   int y = 3;
   Func(&x, &y);
   printf("%d %d\n", x, y);
    return 0;
}

 

9. 출력 결과 : 3 6

이중 배열 문제이다. 아마 복잡해지면 못풀겠지? 아니 풀어야한다.

#include <stdio.h>

int main()
{
    int arr[3][2] = {{1, 2}, {3, 4}, {5, 6}};
    printf("%d %d\n", arr[1][0], arr[2][1]);
    return 0;
}

 

10. 출력 결과 : 12, 50

strlen은 \n 을 만났을 때 카운팅이 종료된다. sizeof()는 위에 50개로 선언해놔서 50으로 출력된다. 만약 "Hello World!"에 sizeof 연산을 하면 null문자를 포함한 갯수를 리턴한다.

#include <stdio.h>
#include <string.h>

int main()
{
    const char str[50] = "Hello World!";
    int nLen = strlen(str);
    int nSize = sizeof(str);

    printf("%d, %d\n", nLen, nSize);
    return 0;
}
728x90
반응형

'알고리즘 풀이' 카테고리의 다른 글

블록 탑 쌓기 위한 최소 에너지 구하기 C++  (0) 2025.03.30