[오토마타] 2. 유한 비결정적 오토마타(NFA, Non-deterministic Finite Automata)
·
개인 공부
NFADFA의 전이함수 δ는 가능한 모든 상태와 알파벳에 대하여, 하나의 다음 상태를 반환한다고 했다. 이 특징은 DFA의 이름에 들어간 "Deterministic(결정적인)" 이라는 수식어에서도 알 수 있다. 반면 "Non"-deterministic한 유한 오토마타인 NFA(Nondeterministic Finite Automata)의 전이함수 δ는 반환값이 하나가 아닌 여러개이거나, 0개일수도 있다.위 diagram의, $q_0$에서 뻗어나오는 화살표를 보자. 0이라는 입력에 대해 두 개의 화살표로 뻗어나오고 있다. 반면 $q_1$의 경우, 0이라는 입력에 대해 어떤 뻗어나오는 화살표도 찾아볼 수 없다. 위 오토마타에 "00101"이라는 입력이 들어왔을 때를 생각해보자. 이제는 상태변화가 한 줄기가 ..
스킨을 적용한 티스토리 블로그에서 MathJax로 수식 입력하기
·
일상이야기
티스토리 글에서 수식을 입력하기 위해 MathJax를 이용하면 편리하다. 자바스크립트 MathJax 모듈 내 코드는 LaTeX 문법을 수식으로 변환해준다. 예를 들어 `1 \lt 2` 를 $ 1 \lt 2 $ 로 보이게끔 바꿔준다. 이 MathJax를 적용하는 방법은 구글링을 통해 쉽게 찾을 수 있다. 그리고 대다수의 블로그는 티스토리의 스킨 HTML의 태그 안에 아래의 그러나, 이 방법은 나에게 동작하지 않았다. 정확히는 매번 화면에 진입할때마다 수식이 제대로 보이기도 했고, 안 보이기도 했다. 그 이유는 티스토리가 글을 로딩하는 시점과 MathJax 모듈을 로딩하는 시점의 차이 때문으로 분석된다. 1. 티스토리 글이 MathJax 모듈보다 먼저 로딩(실행)될 경우- 티스토리 글 로딩 -> 로딩된 ..
[오토마타] 1. 유한 결정적 오토마타(DFA, Deterministic Finite Automata)
·
개인 공부
컴퓨터란 무엇인가?컴퓨터는 무엇을 할 수 있고, 무엇을 할 수 없는가?컴퓨터가 연산하기 쉬운 문제와 어려운 문제의 차이는 무엇인가? 위 질문들은 컴퓨터 과학의 가장 근본적인 질문들이다. 연산 이론(computational theory)은 위 질문들을 고민하는 전산학의 한 꼭지다. 이 질문들이 어려운 이유는 현대의 컴퓨터는 수학적으로 정의하기 너무나도 복잡한 기계장치이기 때문이다. 컴퓨터란 무엇일까? 컴퓨터의 특징을 생각해보자. 컴퓨터의 메모리는 유한하다. 즉 메모리가 표현할 수 있는 상태들도 유한하다.컴퓨터의 연산 결과 또한 유한한 메모리로 표현가능하다.컴퓨터는 연산을 수행하는 장치이다. 그러나 컴퓨터는 입력이 들어오기 전까지, 다음에 자신이 수행해야 할 연산에 대해 알 수 없다.컴퓨터는 몇 가지 기본 ..
취미로 백준을 풀어보려는 사람에게
·
일상이야기
저는 고등학생 시절 정보올림피아드를 준비해본 적도 있고, 학교 전공 수업에서도 여러 이론들을 접했지만, 꽤 오래 개발만을 하면서 알고리즘과는 멀어져 있었습니다. 그러나 모종의 이유로, 최근 백준을 시작했습니다. 언어는 가장 기본이라 생각되는 c++로 정했습니다. 약 한 달 정도 백준을 풀어본 지금, 백준을 시작하려고 하는 과거의 저에게 알려줬다면 관심있게 들었을 내용들을 소개해보고자 합니다. solved.ac백준을 시작하려는 마음은 먹었으나, 어떻게 시작해야할지 당혹스러울 수 있습니다. 처음에는 백준에서 제공하는 단계별로 풀어보기탭을 이용하였고, 이 순서대로 문제를 풀어보는 것도 나쁘지 않아 보입니다. 하지만, solved.ac는 훨씬 강한 동기부여를 제공합니다. solved.ac는 내가 해결한 문제들을..
개발 생산성을 높이는 MCP의 개념과 Cursor AI 설정법
·
개발이야기
"바이브 코딩"이라는 단어와 함께 MCP에 대한 관심이 뜨겁습니다. Cursor AI라는 코드 에디터는 LLM이 직접 로컬 프로젝트 파일들을 직접 수정하고 코드를 작성하며 바이브 코딩을 가능케 합니다(Cursor AI에 대해서는 이 글을 참고하세요). 그러나, LLM은 간혹 '할루시네이션' 문제를 일으키거나, 잘못된/버그가 있는 코드를 생성하거나, 최신 정보를 알지 못하여 낡은 답변을 내놓는 등의 한계를 보여줍니다. MCP는 이런 한계점들을 돌파할 수 있도록 LLM에게 쥐어줄 수 있는 도구와 같습니다. 이 글에서는 MCP가 무엇인지와 Cursor AI에서 어떻게 설정할 수 있는지를 소개합니다MCP란?MCP(Model Context Protocol)는 LLM과 외부의 도구를 연결하는 방법에 대한 규약입니다..
OCaml에 대해 실전 속성 압축으로 익혀보기
·
개발이야기
저는 지난 봄학기 어느 전공과목에서, OCaml이라는 언어를 이용하여 과제를 해야했습니다. 당연히 이전까지 OCaml을 몰랐고, 딱 과제를 하는데에 지장없는 수준의 실력을 갖게 된 것 같습니다. OCaml의 모든 것을 알고싶지는 않지만, 당장 OCaml로 뭔가를 해야하는 누군가에게 이 글이 도움이 되기를 바라며 작성해봅니다. 저도 절대 OCaml의 전문가가 아님을 다시 한 번 밝힙니다. 여기 코드들을 VSCode에서 실행해보고 싶으시면, 이 익스텐션을 설치하시면 됩니다.OCaml의 컨셉과 문법함수형 프로그래밍OCaml은 철저히 함수형 프로그래밍 언어입니다. 함수형 프로그래밍이 무엇인지도 익숙치 않을 독자를 위해 간단히 예를 들어 보겠습니다. 보통 일반적인 C나 python등 우리에게 익숙한 명령형 프로..
VSCode 환경에서 make로 빌드되는 c파일 gdb로 디버깅하기
·
개발이야기
이번 학기 전공 과목에서 과제를 디버깅하기 위해 설정해 둔 VSCode의 GDB 설정 파일들을 공유합니다(Cursor AI에서도 당연히 동작합니다). 과제는 C 언어로 작성해야 했으며, 미리 정의된 Makefile을 통해 코드의 빌드, 테스트, 클린 작업이 가능했습니다. Makefile 구성은 대략 아래와 같았습니다. program.c 파일과 관련 헤더 파일들을 하나의 목적 파일(program.o)로 컴파일한 후, 이를 실행 파일로 빌드하는 방식입니다. 특별히 주의할 점은, gcc 명령어를 실행할 때 "-g" 옵션을 넘겨주어야 디버깅가능한 파일로 빌드됩니다. 또, "-O2" 등의 옵션은 디버깅 시에 일부 값을 필터링할 수 있으니 디버깅 목적으로는 사용하지 않아야 합니다.HEADERS = program.h..
[전산기조직] 메모리 계층 구조(Memory Hierarchy)
·
개인 공부
5.1 Introduction책꽂이에서 매번 책을 찾아 읽는것보다는, 많이 읽는 책을 책상 위에 두면 시간을 절약할 수 있다. 우리가 필요한 정보는 모든 책에 균등하게 분포되어있지 않기 때문이다. 프로그램 또한, 필요한 코드와 데이터가 균등하게 분포되어 있지 않다. 비슷한 방법으로, 프로그램에게 우리의 메모리가 더 빨라진듯한 환상을 느끼게 해줄 수 있다. 하지만, 빠르면서 큰 메모리는 존재할 수 없다. 책꽂이를 책상위에 얹을수는 없기 때문이다.프로그램의 실행은 지역성의 원리(principle of locality)를 따른다. 프로그램은 시간적/공간적으로 이미 참조한 데이터와 가까운 데이터를 다시 참조할 것이라는 의미이다. 구체적으로 설명하자면, 지역성에는 두 가지 종류가 있다.시간적 지역성(Tempora..