본문 바로가기

전체 글

(23)
정렬 알고리즘 1. 개요 프로그램을 작성할 때 빈번하게 사용되는 정렬은 어떤 데이터가 주어졌을 때 정해진 순서대로 나열하는 것을 말한다. 일반적으로 숫자라면 오름차순 또는 내림차순으로 정렬할 수 있고, 문자 또한 아스키코드에 해당되는 번호에 따라서 정렬이 가능하다. 정렬을 위한 알고리즘의 종류에는 다양한 알고리즘이 존재하고, 각 알고리즘은 서로 다른 성능을 가지고 있다. 이번 글에서는 대표적인 알고리즘에 대해서 알아보고, 최종적으로 어떤 알고리즘이 빠른지 확인해보고자 한다. 각 정렬 알고리즘 이미지 밑에 달아놓은 시각화자료 사이트로 이동해서 어떤 식으로 동작하는지 직접 확인한다면 훨씬 이해하기 편리하다. 2. Bubble sort 버블 정렬 시각화 자료 버블 정렬은 매우 단순한 정렬로 정렬 자체가 어떻게 동작하는지 쉽..
스택과 큐 이미지 출처: twitter - Greg Kyte, CPA 1. 개요 스택과 큐는 데이터 접근 방식을 설명하는 대표적인 자료구조이다. 즉, 자료구조가 코드로 정의된 것이 아니라 행동 양식이 정의되어 어떤 자료구조가 스택 또는 큐로 구분되기 위한 규칙에 해당한다. 이러한 것들을 다른 말로 추상적 자료구조(ADT, Abstract, Data Type)라고 부른다. 데이터를 입력하고 출력하는 그 순서에 따라서 스택과 큐가 구분되고, 이러한 특징을 적재적소에 활용하여 많은 실제 시스템 또는 서비스 등에 적용하고 있다. 이번 글에서는 스택과 큐에 대한 개념과 실제 구현까지 다루어보려고 한다. 2. 스택(Stack) 이미지 출처: Wikipedia - Stack 스택을 설명하는 한 단어를 선택하라고 한다면 바로 L..
해시테이블 1. 해시 테이블 해시테이블은 해시맵이라고도 불리며, Key와 Value라는 두 가지 값을 함께 맵핑하여 데이터를 저장하는 자료구조이다. 이미 각 언어들은 내부적으로 해시테이블의 기능을 제공하고 있고 대표적으로 Python에는 딕셔너리가, Java에는 Map 컬렉션을 통해서 해당 기능을 제공하고 있다. 해시 테이블은 Key를 임의의 해시 함수에 입력하여 출력된 해시 값을 데이터가 저장되는 배열의 인덱스로 활용한다. 따라서, 특정 value에 접근하려 할 때 key를 통해서 해당 value에 바로 접근하는 것이 가능하기 때문에 $O(1)$의 시간복잡도를 가진다. 보통 배열로 미리 hash table의 크기만큼 공간을 만들어두고 사용하지만, 해시 테이블에서는 충돌이라는 이벤트가 자주 발생한다. 이 충돌을 가..
com.samskivert.mustache.MustacheException$Context: No method or field with name '******' on line 11 1. Whitelabel Error Page 최근 개발자들의 사이드 프로젝트를 위한 팀빌딩 플랫폼을 개발 중에 있다. 그리고 개발 과정 중에 만난 Whitelabel Error Page. 가장 마지막 줄을 보면 HTTP Status Code가 status=500 이라고 표시되어 있다. 이것만 봐서는 서버단의 문제인 것은 알겠는데 명확하게 무슨 문제인지 확인하기 어려웠고 그래서 콘솔 창을 확인해보았다. 2. No method or field with name 2022-11-15 21:27:39.303 ERROR 7684 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherSe..
컴퓨터가 변수를 처리하는 방법 컴퓨터에서 프로그램이 실행되기 위해서는 프로그램이 메모리 공간에 적재되어야 합니다. 메모리에 적재된 이후에는 CPU가 한 줄 한 줄 읽어 내려가며 프로그램을 실행합니다. 또한 프로그램을 실행하기 위해서는 프로그램의 크기를 충당할 수 있을 만큼의 메모리 공간을 확보해야 합니다. 흔히 우리가 사용하는 컴퓨터의 메모리는 8gb 또는 16gb로 구성되어 있는데 특정한 프로그램을 실행하면 그 프로그램이 메모리에 적재가 되어 실행이 되는 것입니다. 기본적으로 컴퓨터의 운영체제는 메모리 공간을 아래 그림과 같이 네 가지로 구분하여 관리합니다. 네 가지로 구분되는 각각의 메모리 속 영역은 서로 다른 기능들을 가지고 있습니다. 코드 영역은 그 이름과 같이 한 줄씩 실행할 수 있는 소스코드입니다. 데이터 영역은 변수 중에..
문자열 1. 문자열의 개념 문자열은 문자들의 배열을 뜻합니다. 문자열이 문자들의 배열이라고 했으니 Hello World라는 문자열은 Hello와 World 사이의 띄어쓰기를 포함하여 11개의 공간을 가진 배열일까요? 그렇지 않습니다. 문자열은 컴퓨터 메모리 구조상에서 마지막에 Null값을 포함합니다. Null값은 컴퓨터 상에서 존재하지 않는다는 뜻을 가지고 있고, Hello World 다음에 들어간 null 값은 아무런 의미가 없습니다. 그림으로 Hello World 문자열을 표현한다면 다음과 같습니다. 참고로, null 값은 \0과 같은 형태로 표현되기도 합니다. 이러한 null값은 문자열의 끝을 알리기 위한 목적으로 항상 문자열의 마지막에 삽입됩니다. 따라서 printf() 함수를 실행할 때 컴퓨터는 nul..
문자 1. 아스키 코드 기본적으로 C 프로그램의 문자는 아스키 코드(Ascii Code)를 따릅니다. 아스키 코드는 1바이트로 구성되는 것으로 0부터 127까지 각각의 번호에 따라 서로 다른 문자를 가지고 있습니다. 0부터 9까지의 숫자는 48부터 57까지의 아스키코드에 해당이 됩니다. 즉, 아스키코드의 48번은 문자 0이 되는 것입니다. 마찬가지로 영문 A는 아스키코드의 65번에 해당하고 영문 소문자 a는 아스키코드의 97번에 해당합니다. 캐릭터형 자체에 아스키코드를 넣어서 아스키코드에 해당하는 문자를 출력하는 예제를 작성해보겠습니다. #include int main(void) { char a = 65; printf("%c\n", a); system("pause"); } 결과: A 계속하려면 아무 키나 누르..
포인터 1. 포인터의 개념 포인터를 제외한 변수를 생각했을 때, 변수는 그 자체로 자신의 자료형에 맞는 값을 저장합니다. 그 예로 int형 변수, double형 변수 등이 있습니다. 포인터 변수는 기존의 변수와는 다르게 메모리에 주소 값을 저장합니다. 또한 단순히 주소 값만 저장하는 것이 아니라 어떤 자료형의 주소 값인지도 함께 저장합니다. 수업시간에 교수님께서 사용하시는 레이저 포인터는 칠판의 어딘가를 가리킬 때 사용합니다. 마찬가지로 컴퓨터의 포인터도 메모리의 주소를 가리키고 해당 메모리에 직접 접근할 수 있게 도와줍니다. int a = 5; 다음과 같이 a라는 변수가 초기화 되었다고 가정해보겠습니다. 이와 같이 정의하는 방식은 위 코드 다음에 다른 코드를 작성했을 때 단순히 a를 사용해서 5라는 값을 찾을..