

링크드 리스트(Linked list)에 대한 개념이다.
우선 링크드 리스트란 연결 리스트라고도 하며, 순차적으로 연결된 공간에 데이터를 나열하는 구조인 배열과 대조적으로 링크드 리스트는 떨어진 곳에 존재하는 데이터들을 화살표로 연결해서 관리하는 구조로 되어있다.
C언어에서는 주요한 데이터 구조이지만, Python에서는 리스트 타입이 링크드 리스트의 기능을 모두 지원한다.
노드(Node) : 데이터 저장 단위(데이터값, 포인터)로 구성이 되어있다.
포인터(Pointer) : 각 노드 안에서 다음이나 이전의 노드와의 연결 정보를 가지고 있다.

스택에 대한 개념이다. 스택을 비유로 들면, 바닥에 쌓여있는 책들을 예로 많이 들고 있는데, 그 이유는 스택은 데이터를 제한적으로 접근할 수 있는 구조로 되어있기 때문이다.
한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 구조로 되어있다는 것을 말한다.
따라서 LIFO(Last-In-First-Out)의 정책을 가지고 있는 구조이다.
이는 다음에 정리할 큐(queue)의 FIFO(First-In-First-Out)정책과 상반되는 구조이다.
스택은 대표적으로 우리가 사용하는 컴퓨터 내부의 프로세스 구조의 함수 동작 방식에서 사용이 된다.
스택 구조는 프로세스 실행 구조의 가장 기본으로, 함수 호출시 프로세스 실행 구조를 스택과 비교해서 이해할 필요가 있다.

자료구조에 대한 개념이다. 기본적인 내용이지만 다른 사람에게 설명하듯이 정리해보려고 한다.
자료구조란 데이터 구조(Data Structure) 라는 용어와 혼재해서 사용된다.
대량의 데이터를 효율적으로 관리할 수 있는 데이터 구조를 의미하는 것으로, 현실에 있는 정보를 프로그래밍으로 바꾸려면 정보에서 데이터로 변환이 필요한데 이때 필요한 것이 자료구조이다.
개발자는 현실에 있는 데이터를 활용해서 프로그래밍 언어로 개발을 하기 때문에 데이터를 가지고 개발을 할때 자료구조에 대한 지식은 필수이다. 그리고 데이터 구조에는 다양한 구조들이 있는데, 어떤 데이터 구조를 사용하느냐에 따라 코드의 효율이 즉, 프로그램의 퍼포먼스가 달라진다.
Baekjoon Online Judge의 10989문제의 풀이에서 사용한 계수정렬(Counting sort)에 대해서 정리를 해본다.
계수정렬은 O(N)의 시간복잡도를 갖는다.
계수 정렬을 사용하려면 정렬 대상 배열의 최소값과 최대값을 알고 있어야 한다. 최대값만큼 최대 길이를 설정해서 별도의 리스트를 생성해야 되기 때문이다.
정렬 이름대로 요소의 값에 해당하는 index의 위치에 요소의 갯수만큼 카운트해서 값을 증가시켜 주는 형태를 갖는다.
예를 들어 [1, 5, 1, 5, 6] 이라는 리스트가 있다고 가정하자.
총 5개의 숫자, 최소값은 1, 최대값은 6이라는 전제 조건이 성립하며, 계수정렬을 사용하기 위한 조건을 만족한다.
[시간 제한] 시간복잡도 고려
Java 8: 3 초
Java 8 (OpenJDK): 3 초
Java 11: 3 초
Kotlin (JVM): 3 초
[메모리 제한] 공간복잡도 고려
Java 8: 512 MB
Java 8 (OpenJDK): 512 MB
Java 11: 512 MB
Kotlin (JVM): 512 MB

1 | n = int(input()) |