본문 바로가기

Computer Science30

[자료구조] 단일연결리스트 reverse 메서드 구현 (java) 단일연결리스트의 reverse 메서드를 구현해봅시다. 단일연결리스트의 객체는 head 정보, 그리고 노드는 다음 노드 정보만 가지고 있는 가장 단순한 형태의 단일연결리스트입니다. 코드로 표현하면 다음과 같습니다. public class SinglyLinkedList { Node head; static class Node { int data; Node next; } } 코드를 복잡하게 만들지 않기 위해서 toString()이나 add() 메서드는 이미 구현되어 있다고 가정하겠습니다. public class UnitTest { public static void main(String[] args) { SinglyLinkedList list = new SinglyLinkedList(); list.addLast(.. 2020. 11. 13.
[컴퓨터 구조] 메모리 계층 구조 지역성의 원칙(Principal of Locality) 컴퓨터의 메모리 시스템을 이해하기 위해 필수적으로 이해해야 하는 개념이 바로 지역성의 원칙이다. 메모리 시스템을 설명하는데 가장 많이 이용되는 것이 도서관의 비유이다. 도서관은 컴퓨터의 하드 디스크와 같다. 수많은 책이 있지만 원하는 책을 찾으려면 시간이 오래 걸린다. 나는 컴퓨터의 역사에 관한 레포트를 쓰기 위해 도서관에 왔다. 레포트를 쓰기 위해서 나는 우선 컴퓨터 분야 서가에 가서 필요할만한 책 몇권을 가지고 내 자리로 돌아올 것이다. 나는 책상 위에 책을 쌓아놓고 수시로 그 책들을 참조할 것이다. 이때 책상은 컴퓨터의 메인 메모리, 혹은 캐시 메모리와 비슷하다. 책은 몇 권 없지만 빠르게 참조할 수 있다. 도서관에서 책을 찾는 방법과 프로그램.. 2020. 11. 13.
[자료구조] 파이썬으로 단일연결리스트 구현하기 단일연결리스트 동적 배열의 단점 동적 배열은 연속된 메모리 공간에 값을 할당한다. 파이썬의 리스트는 값을 직접 저장하지 않고 해당하는 객체의 주소를 저장하는 레퍼런스 배열이기 때문에 다른 언어의 배열과는 약간 다르다. 동적 배열은 먼저 크기를 할당해 메모리 공간을 미리 확보해놓고 이후에 값을 저장하기 때문에 대부분의 경우 저장하는 요소의 수가 배열의 길이보다 작다. append 연산은 분할 분석 방식으로는 O(1) 의 시간복잡도를 가지지만 실제로는 배열이 가득 찼을 때 resize 연산을 하면서 O(n) 의 시간복잡도를 가진다. 즉 특정 시점(배열이 가득 찼을 때)에 연산 속도가 갑자기 느려진다. 이는 실시간 시스템에서는 문제를 유발할 수 있다. 동적 배열의 단점을 정리하면 아래와 같다. 동적 배열의 길.. 2020. 11. 8.
[자료구조] 파이썬으로 큐(Queue) 구현하기 큐(Queue) 큐는 한쪽 끝에서 자료를 추가하고 한쪽 끝에서 자료를 꺼내는 선형 자료 구조로 가장 먼저 들어온 자료가 가장 먼저 나가는 FIFO(First In First Out) 방식입니다. 롤에서 랭크 게임을 매칭할 때 "큐를 돌린다"라고 표현하죠. 게임 시작 버튼을 먼저 누른 사람이 먼저 게임을 할 수 있도록 처리해줍니다. 큐는 이처럼 요청이 들어온 순서대로 일을 처리할 때 사용합니다. 큐의 동작 방식 큐가 동작하는 방식을 알아봅시다. 크기가 5인 큐를 만듭니다. Queue = [None, None, None, None, None] 우선 큐는 가장 먼저 들어온 데이터를 가리키는 front 변수와 가장 나중에 들어온 데이터의 위치를 가리키는 back 변수가 필요합니다. 처음에는 큐가 비어있으므로 f.. 2020. 11. 6.
[자료구조] 파이썬으로 스택(Stack) 구현하기 스택(Stack) 스택은 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 선형 자료구조입니다. 가장 마지막에 들어온 데이터가 가장 먼저 나가는 LIFO(Last In First Out)방식을 사용합니다. 웹브라우저의 뒤로가기나 편집기의 되돌리기(undo) 기능이 이런 방식을 이용합니다. 사실 파이썬의 리스트는 스택이 가져야할 메서드를 이미 가지고 있습니다. 따라서 스택 자료형을 따로 만들 필요는 없습니다. 하지만 그냥 공부한다는 생각으로 간단하게 스택 자료형을 만들어봅시다. 기본적으로 아래의 네 가지 연산이 필요합니다. S.push(e): Top에 새로운 요소를 추가 S.pop(): Top 요소를 반환하면서 제거 S.top(): Top 요소를 제거하지 않고 반환 S.is_empty(): 스택이 비어있으면 Tru.. 2020. 11. 6.
[컴퓨터구조] CPU 성능, Clock Speed, CPI 컴퓨터의 성능이란? '어떤 컴퓨터가 더 빠른가?' 혹은 '어떤 컴퓨터가 성능이 더 좋은가?'라는 질문은 무엇을 의미할까요? 보통 속도가 빠르면 성능이 좋다고 생각할 수 있지만 항상 그런 것은 아닙니다. 여객기를 생각해보죠. 여객기 A는 여객기 B보다 속도가 3배 빠릅니다. 하지만 여객기 A는 한번에 100명의 승객을 수용할 수 있는 반면 여객기 B는 한번에 400명의 승객을 수용할 수 있습니다. 승객의 입장에서는 여객기 A가 좋겠지만 항공사 입장에서는 여객기 B가 더 좋을 것입니다. 이처럼 어떤 관점에서 평가하느냐에 따라 성능에 대한 평가가 달라집니다. 이와 마찬가지로 일반 개인 사용자의 입장에서는 하나의 작업을 개시하고 종료하는데 걸리는 시간이 빠른 것이 좋겠죠. 이를 응답시간(Response Time.. 2020. 10. 19.