[말랑 퀴즈] 26/10/06 문제

게시:     수정

카테고리:

태그:

제 말랑말랑 퀴즈 생성기는 이곳에서 확인하실 수 있습니다.

말랑말랑 퀴즈 📝

날짜: 2026-10-07 문제 수: 6문제


Q1. 🟡 보통

C++11/C++14의 const_iterator에 대한 설명으로 가장 올바른 것은?

  • A. C++98에서도 비const 컨테이너에 cbegin()을 호출하면 간단히 const_iterator를 얻을 수 있었으므로, const_iterator는 처음부터 널리 쓰였다.
  • B. C++11에서는 컨테이너의 cbegin()/cend()가 비const 컨테이너에서도 const_iterator를 돌려주고, insert·erase 같은 STL 멤버 함수도 위치를 const_iterator로 받을 수 있게 되어 const_iterator를 쓰기 쉬워졌다.
  • C. 비멤버 함수 std::cbegin/std::cend는 C++11 표준에 이미 포함되어 있어, C++11에서도 using std::cbegin;만으로 일반화된 템플릿 코드를 쓸 수 있다.
  • D. C++11에서 비멤버 cbegin을 직접 구현할 때는, 반드시 컨테이너의 멤버 cbegin()을 호출해야 const_iterator가 반환된다.

출처: game_dev/moderncpp/3/2026-05-02-moderncpp_3_13.md

📝 내 선택: B. 98과 11 버전의 차이점에 대해서는 정확히 잘 모르겠다.


Q2. 🟡 보통

빈칸을 채우시오. (함수 이름은 이 글에서 사용한 이름으로 답하시오. 대소문자는 구분하지 않습니다.)

MongoDB에서 쿼리의 성능을 분석하고 인덱스를 관리하는 코드이다.

db.coll1.find().①___("executionStats")   // 성능 분석
db.coll1.②___({"a":1})                    // 필드 a에 인덱스 추가
db.coll1.GetIndexes()                     // 인덱스 목록
db.coll1.DropIndex({"a":1})               // 인덱스 하나 제거
db.coll1.③___()                           // 인덱스 전체 제거

출처: server/game_server/8/2026-03-13-game_server_8_7.md

📝 내 답: exec, InsertIndex, RemoveAll


Q3. 🔴 어려움

실시간 전략 시뮬레이션(RTS) 게임의 락스텝(Lockstep) 동기화에 대해 답하시오.

(1) 락스텝은 다른 동기화 방식에 비해 통신량이 적다. 그 이유를 “무엇을 주고받는가”의 관점에서 설명하시오.

(2) 플레이어가 입력 명령을 보낼 때 “시간”과 함께 체크섬도 같이 보낸다. 체크섬은 무엇을 위한 것인가?

(3) 네트워크 지연(레이턴시)이 있는 환경에서는 명령이 “언제 실행될지”를 나타내는 미래 시간을 함께 보낸다. 이 미래 시간을 계산하는 식을 쓰고, 미래 시간을 너무 멀게 잡았을 때와 너무 가깝게 잡았을 때 각각 어떤 현상이 생기는지 쓰시오.

(4) 락스텝의 단점을 두 가지 이상 쓰시오.

출처: server/game_server/5/2026-02-15-game_server_5_5.md

📝 내 풀이: (1) 서로의 입력만 주고 받아 화면에 그리기 떄문에 통신량이 적어진다.

(2) 변조를 막기 위함이다.

(3) 시간 + RTT/2 + 알파. 멀게 잡으면 느리게 반응한다. 가깝게 잡으면 더 빠르게 반응하며 명령을 받았을때 너무 이른 명령이 될 수 있다.

(4) 1. 접속자가 많아지면 모두에게 입력을 전송하고 동기화해야 한다.

  1. 난입한 플레이어에 대해 동기화하기 까다롭다.

Q4. 🟢 쉬움

다음 명제가 참(O)인지 거짓(X)인지 판단하라.

TCP는 1:1 통신만 허용하므로 소켓 1개는 상대의 끝점 하나와 대응된다. 또한 클라이언트에서 connect()를 호출하면 상대와의 연결 시도가 끝날 때까지 블로킹되며, 연결에 성공하면 true, 실패하면 false를 반환한다.

출처: server/game_server/3/2026-02-03-game_server_3_2.md

📝 내 답: O. TCP는 1:1 통신이며, 연결 완료될떄까지 블로킹된다.


Q5. 🟢 쉬움

온라인 게임에서 서버의 역할에 대한 설명으로 가장 올바른 것은?

  • A. 1인용 게임의 게임 루프는 “렌더링 → 입력 받기 → 게임 로직 처리” 순서로 반복된다.
  • B. 온라인 게임에서는 여러 플레이어 사이의 상호작용을 중재(동기화)해야 하므로 서버가 필요하며, 대부분의 게임 서버는 클라이언트의 게임 로직 처리 일부를 서버로 옮겨 클라이언트가 허튼 수를 쓰지 못하게 한다.
  • C. 게임 세션은 보통 1초에 6번 상태가 변화하며, 이것을 게임 로직 처리라고 한다.
  • D. 서버는 변화된 상태를 화면에 표현하는 렌더링을 모든 클라이언트를 대신해 수행한다.

출처: server/game_server/4/2026-02-08-game_server_4_3.md

📝 내 선택: B.

A: 게임 로직 처리, 렌더링, 입력 받기 였던것 같다. C: 1초에 60번 변화한다. D: 렌더링은 클라이언트가 수행하는 것이 일반적이다.


Q6. 🟢 쉬움 · 📌 오답노트 (2번째 복습)

빈칸을 채우시오.

두 스레드가 x += y;를 실행하는 상황을 생각해 보자. x의 초기값은 2이고, 스레드 1은 y = 3, 스레드 2는 y = 4로 실행한다. 이 연산은 기계어 수준에서 t = x → t = t + y → x = t 세 단계로 쪼개진다.

# 스레드 1
t1 = x          // t1 = 2
t1 = t1 + 3     // t1 = 5      ← 여기서 컨텍스트 스위치

# 스레드 2 (끝까지 실행)
t2 = x          // t2 = 2
t2 = t2 + 4     // t2 = 6
x = t2          // x = 6

# 다시 스레드 1
x = t1          // x = ①___

이상적으로는 두 연산이 차례로 실행되어 x = 9가 되어야 하지만, 이처럼 두 스레드가 같은 데이터에 접근해 상태를 예측할 수 없게 되는 상황을 ②_ (또는 데이터 레이스)라고 한다. 이를 막으려면 num++처럼 하나의 작업 단위가 도중에 **쪼개지지 않도록** 하는 성질인 ③과, 배열 포인터와 크기처럼 여러 멤버가 항상 서로 어울리는 상태여야 한다는 성질인 ④을 지켜야 하며, 이 두 성질을 가능하게 하는 기술(임계 영역·뮤텍스·잠금 등)을 통칭 ⑤_라고 한다.

출처: server/game_server/1/2025-05-30-game_server_1_5.md 오답노트: wn-7f930a70 · 2026-09-14 최초 오답 · 이번이 2번째 복습

📝 내 답: 5, 레이스 컨디션, 원자성, 일관성, 동기화


MallangQuiz 카테고리 내 다른 글 보러가기

댓글남기기