본문 바로가기
Topos Uranos

요약

이 수업은 강좌의 6단원, 곧 복합 데이터를 다루는 단원을 연다. 단원이 무엇을 위한 것인지 설명한다. 데이터의 컬렉션(고정 크기와 가변 크기의 시퀀스, 표, 레코드)을 표현하고, 직접 작성하거나 라이브러리에서 가져온 기본 알고리즘으로 그것을 처리하며, 그 비용을 추정하는 법을 가르치는 것이다. 단원의 여섯 수업과 그것들을 잇는 실을 소개한다. 단원이 이미 안다고 전제하는 것, 특히 불변식을 갖춘 반복문과 상수 참조 전달을 되짚는다. 단원이 해결하는 문제를 제시한다. 개수를 모르는 데이터를 저장해야 하는데, 낱낱의 변수로 작성하면 남는 데이터를 말없이 흘려버리는 프로그램의 문제이다. 알고리즘을 재는 두 번째 척도로서 정확성과 나란히 놓이는 비용을 미리 소개한다. 그리고 단원이 뒤의 단원들과 C++ 프로그래밍 II 강좌에서 어디로 이어지는지 보여 준다.

학습 목표

  1. 단원의 내용 순서를 설명하고, 각 수업이 뒤이은 수업에 무엇을 보태는지 설명한다.
  2. 반복문과 그 불변식, 매개변수 전달(값 전달, 참조 전달, 상수 참조 전달)을 떠올리고, 필요하면 복습한다.
  3. 예를 통해 알고리즘의 비용을, 정확성과 나란히 놓이는 품질의 두 번째 척도로서 미리 익힌다.
  4. 단원을 마쳤을 때 할 줄 알아야 하는 것이 무엇인지 알고, 그것을 뒤의 단원들에서 배울 것과 구별한다.

입문 평가

단원을 시작하기 전에 출발점을 재어 두면 좋다. 이 평가는 자기 평가이며 점수를 매기지 않는다. 목적은 오직 학습의 방향을 잡는 데 있다. 처음 네 문항은 단원이 이미 안다고 전제하는 것을 확인한다. 최댓값을 찾는 반복문의 불변식, 큰 매개변수의 전달 방식, 이중 중첩 반복문의 회차 수, 그리고 부호 없는 산술이다. 그 뒤의 여섯 문항은 수업 순서대로 단원의 핵심 개념을 다룬다. 시퀀스의 유효한 인덱스, 벡터의 생성, 어떤 크기를 절반으로 나눌 수 있는 횟수, 정렬된 데이터에서의 탐색, 표의 이중 인덱스, 그리고 같은 개체의 데이터를 서로 떨어진 컬렉션에 저장하는 위험이다. 아직 맞힐 의무는 누구에게도 없으며, 그중 몇 문항에서는 “아직 모르겠다”가 정직한 답이다. 맞든 틀리든 모든 답이 요점을 설명하고 그 요점을 다루는 수업을 알려 주기 때문이다. 같은 능력은 단원 끝의 종합 수업에서 다시 측정한다.

입문 평가

단원을 시작하기 전에 출발점을 확인해 보세요. 짧은 자기 평가입니다. 점수가 매겨지지 않으며 결과는 브라우저에만 저장됩니다.

  1. 문제 1이전 단원에서int largest{0}; int t{}; while (std::cin >> t) { if (t > largest) { largest = t; } } 코드 조각은 largest 변수에 읽은 기온 가운데 가장 높은 것을 남겨야 한다. 어떤 입력에서 실패하는가?

  2. 문제 2이전 단원에서어떤 함수가 std::string 객체에 저장된 백만 자짜리 텍스트에 모음이 몇 개 있는지 세고, 텍스트는 수정하지 않는다. 그 매개변수는 어떻게 선언하는 것이 좋은가?

  3. 문제 3이전 단원에서++count 문장은 for (int i{0}; i < 6; ++i) { for (int j{0}; j < i; ++j) { ++count; } } 코드에서 몇 번 실행되는가?

  4. 문제 4이전 단원에서std::println("{}", 0u - 1); 문장은 unsigned int 타입이 32비트인 시스템에서 무엇을 출력하는가?

  5. 문제 5C++처럼 번호를 매긴 nn개 원소의 시퀀스에서, 원소를 가리키는 인덱스 ii는 어느 것인가?

  6. 문제 6v 벡터에는 std::vector<int> v(3, 7); 문장 뒤에 무엇이 들어 있는가?

  7. 문제 7for (int m{1024}; m > 1; m /= 2) { ... } 반복문은 몇 회 도는가?

  8. 문제 8어떤 전화번호부에 이름 백만 개가 가나다순으로 실려 있다. 하나를 찾으려고 전화번호부를 한가운데에서 펼치고, 이름이 있을 수 없는 절반을 버린 뒤, 나머지 절반으로 같은 일을 되풀이한다. 최대 몇 번 펼쳐야 하는가?

  9. 문제 9std::vector<std::vector<int>> t{{1, 2, 3}, {4, 5, 6}}; 문장이 있을 때 t[1][0] 값과 t.size() 값은 얼마인가?

  10. 문제 10어떤 프로그램이 한 집단의 이름은 한 벡터에, 그들의 성적은 다른 벡터에 저장하여, 성적 grades[i] 원소가 names[i] 원소의 성적이 되게 한다. 성적 벡터만 정렬하면 어떻게 되는가?