트랙
/
C++
C++
/
연습 문제
/
연결 리스트
연결 리스트

연결 리스트

보통

소개

바쁜 철도 네트워크를 위한 열차 운행 일정 시스템을 개발하는 프로젝트를 진행하고 있어요.

이 운행 일정 시스템에서 쓸 열차 노선의 프로토타입을 만들어 달라는 요청을 받았어요. 각 노선은 특정 열차가 정차하는 역들의 순서로 구성되어 있어요.

지침

여러분의 팀은 시간표에 있는 각 기차 노선을 표현하는 데 이중 연결 리스트를 사용하기로 했어요. 기차 노선을 따라 있는 각 역은 연결 리스트의 노드로 표현돼요.

역의 도착 시간과 출발 시간은 신경 쓰지 않아도 돼요. 각 역은 그냥 숫자로 표현돼요.

노선은 확장할 수 있어요. 노선의 처음이나 끝에 역을 추가하면 돼요. 노선의 처음이나 끝에서 역을 제거하면 노선을 줄일 수도 있어요.

가끔 역이 폐쇄되기도 하는데, 이때는 그 역이 노선의 처음이나 끝에 있지 않더라도 노선에서 제거해야 해요.

노선의 크기는 기차가 얼마나 멀리 가는지가 아니라 몇 개의 역에 정차하는지로 측정해요.

Note

연결 리스트는 컴퓨터 과학의 기본적인 자료 구조로, 다른 자료 구조를 구현할 때 자주 사용돼요. 이름에서 알 수 있듯이, 연결 리스트는 서로 연결된 노드들의 리스트예요. 각 노드가 이웃한 노드 하나 또는 여러 개와 연결된 "노드"들의 리스트예요. 단일 연결 리스트에서는 각 노드가 자신의 뒤에 오는 노드에만 연결돼요. 이중 연결 리스트에서는 각 노드가 자신의 앞에 오는 노드와 뒤에 오는 노드 모두에 연결돼요.

연결 리스트를 더 깊이 파고들고 싶다면, 멋진 그림으로 설명해 주는 이 글을 확인해 봐요.

C++ track에서 이 연습 문제가 구성되는 방식

연결 리스트는 다양한 기반 자료 구조를 이용해 여러 방식으로 구현할 수 있지만, 여기서는 연결 리스트를 객체 지향 방식으로 구현해 주세요.

linked_list_test.cpp 파일을 보면 템플릿 List 클래스가 호출되는 것을 알 수 있어요. 이 클래스에는 다음 멤버 함수를 작성해야 해요:

  • push는 리스트 끝에 원소를 추가하고,
  • pop은 리스트의 마지막 원소를 제거한 뒤 반환하고,
  • shift는 리스트의 첫 번째 원소를 제거한 뒤 반환하고,
  • unshift는 리스트 맨 앞에 원소를 추가하고,
  • count는 현재 리스트에 있는 원소의 총 개수를 반환해요.

마지막으로, 위에서 설명한 메서드에 더해 erase도 구현해 주세요. erase는 인자 하나를 받는데, 그 인자는 연결 리스트에서 제거할 값이에요. 같은 값이 두 번 이상 나타나면 처음 나타난 것 하나만 제거해야 해요. erase는 원소가 삭제되었는지 여부를 반환해야 해요.

테스트되지는 않지만, 빈 List에서 pop과 shift를 호출하면 예외를 발생시키고 싶을 수도 있어요.


출처

고전적인 컴퓨터 과학 주제
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
C++ Exercism

연결 리스트 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 C++ 트랙을 개념 19개연습 문제 100개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.