{
  "title": "컴퓨터과학 심화 O/X",
  "description": "자료구조·알고리즘·시스템 원리",
  "languageCode": "ko",
  "cards": [
    {
      "type": "ox",
      "prompt": "이진 탐색(binary search)은 정렬된 배열에서 O(log n) 시간에 값을 찾을 수 있다.",
      "answer": true,
      "explanation": "이진 탐색은 매 단계마다 탐색 범위를 절반으로 줄여 O(log n)의 시간복잡도를 가집니다."
    },
    {
      "type": "ox",
      "prompt": "스택(stack)은 나중에 들어온 데이터가 먼저 나가는 LIFO 구조다.",
      "answer": true,
      "explanation": "스택은 Last In First Out으로, 가장 나중에 넣은 원소가 가장 먼저 빠져나옵니다."
    },
    {
      "type": "ox",
      "prompt": "큐(queue)는 먼저 들어온 데이터가 먼저 나가는 FIFO 구조다.",
      "answer": true,
      "explanation": "큐는 First In First Out으로, 먼저 삽입된 원소가 먼저 제거됩니다."
    },
    {
      "type": "ox",
      "prompt": "컴퓨터는 내부적으로 데이터를 10진수로 저장하고 처리한다.",
      "answer": false,
      "explanation": "컴퓨터는 0과 1로 이루어진 2진수로 데이터를 저장하고 처리합니다."
    },
    {
      "type": "ox",
      "prompt": "해시 테이블은 평균적으로 O(1)에 가까운 시간에 삽입·검색을 수행할 수 있다.",
      "answer": true,
      "explanation": "충돌이 잘 관리되면 해시 테이블은 평균 O(1) 시간에 삽입·검색이 가능합니다."
    },
    {
      "type": "ox",
      "prompt": "운영체제의 역할 중 하나는 CPU, 메모리 등 하드웨어 자원을 여러 프로세스에 배분·관리하는 것이다.",
      "answer": true,
      "explanation": "운영체제는 자원 관리자로서 프로세스에 CPU·메모리 등을 스케줄링하고 배분합니다."
    },
    {
      "type": "ox",
      "prompt": "컴파일러는 소스 코드를 한 줄씩 즉시 실행하며 기계어로 변환하지 않는다.",
      "answer": false,
      "explanation": "컴파일러는 소스 코드 전체를 기계어(목적 코드)로 번역합니다. 한 줄씩 실행하는 것은 인터프리터입니다."
    },
    {
      "type": "ox",
      "prompt": "빅오 표기법에서 O(n²)은 O(n log n)보다 입력이 커질수록 더 빠르게 증가한다.",
      "answer": true,
      "explanation": "점근적으로 n²은 n log n보다 빠르게 증가하므로 대규모 입력에서 더 느립니다."
    },
    {
      "type": "choice",
      "prompt": "1바이트(byte)는 몇 비트(bit)인가?",
      "choices": [
        "8비트",
        "4비트",
        "16비트",
        "10비트"
      ],
      "answer": 1,
      "explanation": "1바이트는 8비트로 구성됩니다."
    },
    {
      "type": "choice",
      "prompt": "다음 중 비선형 자료구조에 해당하는 것은?",
      "choices": [
        "트리",
        "배열",
        "스택",
        "큐"
      ],
      "answer": 1,
      "explanation": "트리는 계층적 비선형 자료구조이고, 배열·스택·큐는 선형 자료구조입니다."
    },
    {
      "type": "text",
      "prompt": "2진수 1011을 10진수로 바꾸면? (숫자만 입력)",
      "answers": [
        "11",
        "십일"
      ],
      "explanation": "1011(2) = 8 + 0 + 2 + 1 = 11(10) 입니다."
    },
    {
      "type": "text",
      "prompt": "정렬된 데이터에서 가운데 값과 비교하며 탐색 범위를 절반씩 줄이는 탐색 알고리즘의 이름은?",
      "answers": [
        "이진 탐색",
        "이진탐색",
        "binary search",
        "이분 탐색",
        "이분탐색"
      ],
      "explanation": "이진 탐색은 정렬된 자료에서 중앙값 비교로 범위를 절반씩 줄여 O(log n)에 탐색합니다."
    },
    {
      "type": "ox",
      "prompt": "연결 리스트(linked list)는 중간에 원소를 삽입·삭제할 때 배열처럼 뒤의 원소들을 밀어낼 필요가 없다.",
      "answer": true,
      "explanation": "연결 리스트는 노드의 포인터만 바꾸면 되므로, 위치를 알고 있다면 삽입·삭제가 O(1)에 가능합니다."
    },
    {
      "type": "ox",
      "prompt": "퀵 정렬(quick sort)의 최악의 경우 시간복잡도는 O(n log n)이다.",
      "answer": false,
      "explanation": "퀵 정렬은 평균 O(n log n)이지만, 피벗이 계속 치우치는 최악의 경우 O(n²)까지 느려집니다."
    },
    {
      "type": "choice",
      "prompt": "다음 중 최악의 경우에도 O(n log n) 시간복잡도를 보장하는 정렬 알고리즘은?",
      "choices": [
        "병합 정렬",
        "퀵 정렬",
        "버블 정렬",
        "삽입 정렬"
      ],
      "answer": 1,
      "explanation": "병합 정렬은 항상 절반씩 나누어 합치므로 최악에도 O(n log n)을 보장합니다. 퀵 정렬은 최악 O(n²)입니다."
    },
    {
      "type": "ox",
      "prompt": "힙(heap) 자료구조를 이용하면 최댓값 또는 최솟값을 O(1)에 조회할 수 있다.",
      "answer": true,
      "explanation": "힙은 루트에 최댓값(최대 힙) 또는 최솟값(최소 힙)이 오도록 유지되어 루트 조회가 O(1)입니다."
    },
    {
      "type": "ox",
      "prompt": "데드락(교착 상태)은 CPU 속도가 충분히 빨라지면 항상 자동으로 해소된다.",
      "answer": false,
      "explanation": "데드락은 프로세스들이 서로의 자원을 기다리는 순환 대기 때문에 생기므로 CPU 속도와 무관하며, 예방·회피·탐지 기법으로 다뤄야 합니다."
    },
    {
      "type": "text",
      "prompt": "음이 아닌 가중치 그래프에서 한 정점으로부터의 최단 경로를 구하는 대표적인 알고리즘은? (개발자 이름)",
      "answers": [
        "다익스트라",
        "데이크스트라",
        "다익스트라 알고리즘",
        "dijkstra"
      ],
      "explanation": "다익스트라 알고리즘은 음이 아닌 가중치 그래프에서 시작점으로부터 각 정점까지의 최단 경로를 구합니다."
    },
    {
      "type": "ox",
      "prompt": "하나의 프로세스는 여러 개의 스레드를 가질 수 있다.",
      "answer": true,
      "explanation": "프로세스는 실행 중인 프로그램 단위이고, 그 안에서 여러 스레드가 메모리를 공유하며 동시에 작업할 수 있습니다."
    },
    {
      "type": "ox",
      "prompt": "깊이 우선 탐색(DFS)은 일반적으로 큐(queue)를 이용해 구현한다.",
      "answer": false,
      "explanation": "DFS는 스택(또는 재귀 호출)으로 구현합니다. 큐를 사용하는 것은 너비 우선 탐색(BFS)입니다."
    },
    {
      "type": "choice",
      "prompt": "운영체제가 실행 중인 프로세스의 상태를 저장하고 다른 프로세스로 CPU를 넘기는 작업은?",
      "choices": [
        "디스크 조각 모음",
        "문맥 교환(컨텍스트 스위칭)",
        "가비지 컬렉션",
        "스풀링"
      ],
      "answer": 2,
      "explanation": "문맥 교환(컨텍스트 스위칭)은 현재 프로세스의 상태를 저장한 뒤 다른 프로세스의 상태를 불러와 CPU를 전환하는 작업입니다."
    },
    {
      "type": "ox",
      "prompt": "뮤텍스나 세마포어는 여러 스레드의 공유 자원 접근을 제어하는 데 사용된다.",
      "answer": true,
      "explanation": "뮤텍스와 세마포어는 동기화 도구로, 공유 자원에 동시에 접근해 생기는 경쟁 상태를 막습니다."
    },
    {
      "type": "ox",
      "prompt": "이진 트리(binary tree)에서 각 노드는 최대 3개의 자식 노드를 가질 수 있다.",
      "answer": false,
      "explanation": "이진 트리의 각 노드는 자식을 최대 2개까지만 가질 수 있습니다. '이진(二進)'이 둘을 뜻합니다."
    },
    {
      "type": "text",
      "prompt": "8진수 10을 10진수로 바꾸면? (숫자만 입력)",
      "answers": [
        "8",
        "팔"
      ],
      "explanation": "8진수 10은 8¹×1 + 8⁰×0 = 8이므로 10진수로 8입니다."
    },
    {
      "type": "ox",
      "prompt": "시간복잡도 O(1)은 입력이 커질수록 실행 시간이 비례해서 늘어난다는 뜻이다.",
      "answer": false,
      "explanation": "O(1)은 입력 크기와 무관하게 일정한 시간이 걸린다는 뜻입니다. 입력에 비례해 늘어나는 것은 O(n)입니다."
    },
    {
      "type": "ox",
      "prompt": "트리(tree)는 사이클이 없는 연결 그래프의 일종이다.",
      "answer": true,
      "explanation": "트리는 모든 정점이 연결되어 있으면서 사이클이 없는 그래프로, n개 정점이면 간선이 n-1개입니다."
    },
    {
      "type": "choice",
      "prompt": "다음 시간복잡도 중 입력이 커질 때 가장 느리게 증가하는(가장 효율적인) 것은?",
      "choices": [
        "O(n)",
        "O(n²)",
        "O(log n)",
        "O(2ⁿ)"
      ],
      "answer": 3,
      "explanation": "증가 속도는 O(log n) < O(n) < O(n²) < O(2ⁿ) 순이므로 O(log n)이 가장 효율적입니다."
    },
    {
      "type": "ox",
      "prompt": "CPU 스케줄링의 라운드 로빈 방식은 우선순위가 가장 높은 프로세스만 계속 실행한다.",
      "answer": false,
      "explanation": "라운드 로빈은 각 프로세스에 시간 할당량을 주고 차례대로 돌아가며 실행하는 방식입니다."
    },
    {
      "type": "ox",
      "prompt": "압축한 데이터를 원본과 완전히 동일하게 복원할 수 있으면 무손실 압축이다.",
      "answer": true,
      "explanation": "무손실 압축(ZIP, PNG 등)은 원본을 그대로 복원할 수 있고, 손실 압축(JPG, MP3 등)은 일부 정보를 버립니다."
    },
    {
      "type": "text",
      "prompt": "참(1)과 거짓(0)의 논리값과 AND·OR·NOT 연산을 다루며 디지털 회로의 기초가 되는 대수 체계는? (○○ 대수)",
      "answers": [
        "불",
        "부울",
        "불리언",
        "불 대수",
        "부울 대수",
        "불대수",
        "부울대수",
        "boolean"
      ],
      "explanation": "불(부울) 대수는 조지 불이 만든 논리 대수로, 논리 회로 설계와 프로그래밍 논리의 기초입니다."
    },
    {
      "type": "ox",
      "prompt": "부동 소수점 연산은 어떤 경우에도 오차 없이 정확한 결과를 낸다.",
      "answer": false,
      "explanation": "부동 소수점은 한정된 비트로 실수를 근사 표현하므로 0.1 + 0.2 ≠ 0.3처럼 미세한 오차가 생길 수 있습니다."
    },
    {
      "type": "ox",
      "prompt": "버블 정렬은 인접한 두 원소를 비교하고 교환하는 과정을 반복해 정렬한다.",
      "answer": true,
      "explanation": "버블 정렬은 이웃한 원소끼리 비교·교환을 반복하며 큰 값이 거품처럼 끝으로 밀려나는 O(n²) 정렬입니다."
    },
    {
      "type": "choice",
      "prompt": "해시 테이블에서 서로 다른 키가 같은 해시값을 갖게 되는 현상을 무엇이라 하는가?",
      "choices": [
        "오버플로",
        "데드락",
        "페이지 폴트",
        "충돌(collision)"
      ],
      "answer": 4,
      "explanation": "서로 다른 키가 같은 위치로 해싱되는 것을 충돌(collision)이라 하며, 체이닝·개방 주소법 등으로 해결합니다."
    },
    {
      "type": "ox",
      "prompt": "논리 게이트 AND는 두 입력 중 하나만 1이어도 출력이 1이다.",
      "answer": false,
      "explanation": "AND 게이트는 두 입력이 모두 1일 때만 1을 출력합니다. 하나만 1이어도 1이 되는 것은 OR 게이트입니다."
    },
    {
      "type": "ox",
      "prompt": "폰 노이만 구조에서는 프로그램과 데이터가 같은 메모리에 저장된다.",
      "answer": true,
      "explanation": "폰 노이만 구조는 명령어(프로그램)와 데이터를 하나의 메모리에 함께 저장하는 저장 프로그램 방식으로, 현대 컴퓨터의 기본 구조입니다."
    },
    {
      "type": "text",
      "prompt": "정렬되지 않은 배열에서 처음부터 끝까지 차례로 비교하며 값을 찾는 가장 단순한 탐색 방법은?",
      "answers": [
        "순차 탐색",
        "순차탐색",
        "선형 탐색",
        "선형탐색",
        "linear search",
        "sequential search"
      ],
      "explanation": "순차 탐색(선형 탐색)은 원소를 앞에서부터 하나씩 비교하는 O(n) 탐색으로, 정렬되지 않은 자료에도 쓸 수 있습니다."
    }
  ]
}
