CS

글 27개

글자가 깨졌을 때 - 증상만 보고 어디부터 볼지 고르기

CS · Encoding

글자가 깨졌을 때 - 증상만 보고 어디부터 볼지 고르기

깨진 글자의 생김새는 아무렇게나 정해지지 않는다. 물음표 마름모, 네모 상자, 엉뚱한 한자는 각각 다른 곳이 어긋났다는 신호다. 이 시리즈를 한 장의 판단표로 접는다.

0과 1로 어떻게 담나 9편

Base64와 퍼센트 인코딩 - 바이트를 글자로 포장하기

CS · Encoding

Base64와 퍼센트 인코딩 - 바이트를 글자로 포장하기

글자만 지나갈 수 있는 길에 바이너리를 실어 보내야 할 때가 있다. 그럴 때 쓰는 포장이 Base64와 퍼센트 인코딩이다. 왜 크기가 늘어나는지, 그리고 왜 이걸 암호로 착각하면 안 되는지를 본다.

0과 1로 어떻게 담나 8편

글자 수 세기 - 이모지 하나가 일곱 글자로 세지는 이유

CS · Encoding

글자 수 세기 - 이모지 하나가 일곱 글자로 세지는 이유

입력창에 100자 제한을 걸었는데 사용자는 40자만 쓰고도 막힌다. 사람이 세는 글자와 컴퓨터가 세는 단위가 층마다 다르기 때문이다. 눈에 같아 보이는 두 글자가 서로 다른 데이터인 경우도 여기서 나온다.

0과 1로 어떻게 담나 7편

UTF-8 - 상자 크기를 글자마다 다르게 고른 결과

CS · Encoding

UTF-8 - 상자 크기를 글자마다 다르게 고른 결과

15만 개가 넘는 번호를 바이트에 담는 방법은 여럿이었는데 UTF-8이 세상을 다 먹었다. 이긴 이유는 영리한 압축이 아니라 옛 파일을 하나도 안 건드렸다는 데 있다.

0과 1로 어떻게 담나 6편

아스키에서 유니코드로 - 번호부를 하나로 합치기까지

CS · Encoding

아스키에서 유니코드로 - 번호부를 하나로 합치기까지

처음엔 글자 128개면 충분했다. 나라마다 남은 자리를 제 맘대로 쓰면서 같은 번호가 서로 다른 글자를 가리키게 됐고, 문서는 국경을 넘을 때마다 깨졌다. 유니코드는 그 혼란을 어떻게 끝냈나.

0과 1로 어떻게 담나 5편

부동소수점 - 0.1 더하기 0.2가 0.3이 아닌 이유

CS · Encoding

부동소수점 - 0.1 더하기 0.2가 0.3이 아닌 이유

거의 모든 언어에서 0.1 + 0.2는 0.3이 아니다. 버그가 아니라 소수를 담는 방식이 그렇게 생겼다. 왜 못 맞추는지, 왜 큰 수일수록 더 성겨지는지, 그리고 돈을 여기에 담으면 안 되는 이유를 본다.

0과 1로 어떻게 담나 4편

정수와 넘침 - 21억 다음에 오는 것

CS · Encoding

정수와 넘침 - 21억 다음에 오는 것

정수를 담는 칸은 자리 수가 정해져 있다. 그 칸을 넘어서면 프로그램은 멈추지 않고 조용히 이상한 값을 내놓는다. 왜 최대값 다음이 최소값인지, 왜 하필 한가운데서 터지는지를 본다.

0과 1로 어떻게 담나 3편

비트와 바이트 - 자리가 하나 늘면 세상이 두 배가 된다

CS · Encoding

비트와 바이트 - 자리가 하나 늘면 세상이 두 배가 된다

컴퓨터가 담는 칸은 켜짐과 꺼짐 둘뿐이다. 그 칸이 하나 늘 때마다 담을 수 있는 것이 두 배가 되고, 여덟 개를 묶은 바이트가 모든 이야기의 기본 단위가 된다. 16진수가 왜 굳이 끼어드는지도 여기서 풀린다.

0과 1로 어떻게 담나 2편

인코딩 - 컴퓨터는 글자를 모른다

CS · Encoding

인코딩 - 컴퓨터는 글자를 모른다

화면 가득한 글자를 컴퓨터는 하나도 모른다. 저장된 것은 숫자뿐이고, 그 숫자를 글자로 되돌리는 건 미리 나눠 가진 약속이다. 그 약속이 어긋날 때 무슨 일이 벌어지는지부터 본다.

0과 1로 어떻게 담나 1편

느릴 때 무엇부터 의심하나 - 길 고르기 한 장

CS · Algorithm

느릴 때 무엇부터 의심하나 - 길 고르기 한 장

이 시리즈에서 낸 길들을 한 장에 놓는다. 그리고 실제로 코드가 느릴 때 무엇부터 의심해야 하는지, 그 순서가 왜 알고리즘부터가 아닌지.

문제를 어떻게 푸나 9편

그리디 - 지금 제일 좋아 보이는 것

CS · Algorithm

그리디 - 지금 제일 좋아 보이는 것

앞뒤 안 재고 매 순간 최선을 고르는 방법. 빠르고 코드도 짧은데, 언제 맞는지는 짐작이 아니라 증명으로만 알 수 있다.

문제를 어떻게 푸나 8편

동적 계획법 - 한 번 푼 것은 다시 안 푼다

CS · Algorithm

동적 계획법 - 한 번 푼 것은 다시 안 푼다

이름이 어렵지 하는 일은 하나다. 계산한 값을 적어두고 다시 묻지 않는 것. 대신 적어둘 자리를 내줘야 하고, 진짜 어려운 건 무엇을 적을지 정하는 일이다.

문제를 어떻게 푸나 7편

분할 정복 - 쪼개서 풀고 합친다

CS · Algorithm

분할 정복 - 쪼개서 풀고 합친다

쪼개면 왜 빨라지는가. 이득의 출처는 나누기가 아니라 합치기이고, 그 사실을 알면 n log n이 어디서 나오는지도 같이 보인다.

문제를 어떻게 푸나 6편

재귀 - 자기를 부르는 함수

CS · Algorithm

재귀 - 자기를 부르는 함수

재귀는 어려운 기교가 아니라 '같은 모양의 더 작은 문제'를 그대로 코드로 옮긴 것이다. 필요한 건 둘뿐이고, 무너지는 자리도 정해져 있다.

문제를 어떻게 푸나 5편

이진탐색 - 반을 버릴 수 있을 때

CS · Algorithm

이진탐색 - 반을 버릴 수 있을 때

정렬해 두면 한 번 볼 때마다 절반을 통째로 버릴 수 있다. 그 조건이 무엇인지, 그리고 왜 이 짧은 코드가 그렇게 자주 틀리는지.

문제를 어떻게 푸나 4편

정렬 - 줄을 세우는 값과 그 대가

CS · Algorithm

정렬 - 줄을 세우는 값과 그 대가

정렬은 그 자체로 답인 경우보다 다른 일을 싸게 만들려고 하는 경우가 많다. 방식이 갈리는 지점과, 실무에서 진짜로 물어야 하는 안정성 이야기.

문제를 어떻게 푸나 3편

완전탐색 - 다 해보는 것이 기준선이다

CS · Algorithm

완전탐색 - 다 해보는 것이 기준선이다

가장 먼저 떠올려야 할 방법은 전부 해보는 것이다. 무식해서가 아니라, 후보가 몇 개인지를 세어봐야 더 나은 방법이 필요한지 알 수 있어서다.

문제를 어떻게 푸나 2편

알고리즘 - 답이 아니라 답에 이르는 길

CS · Algorithm

알고리즘 - 답이 아니라 답에 이르는 길

알고리즘은 어려운 수학 이름이 아니라 답에 이르는 절차다. 목적지가 같아도 길은 여럿이고, 무엇을 골랐느냐가 걸리는 시간을 정한다.

문제를 어떻게 푸나 1편

무엇을 언제 고르나 - 그릇 고르기 한 장

CS · Data Structure

무엇을 언제 고르나 - 그릇 고르기 한 장

이 시리즈에서 연 그릇들을 한 장에 놓는다. 고르는 순서는 셋이고, 대부분의 문제는 그중 첫 질문에서 끝난다.

자료를 어떻게 담나 9편

그래프 - 관계 자체가 데이터다

CS · Data Structure

그래프 - 관계 자체가 데이터다

노선도에서 값은 역이 아니라 역 사이의 선에 있다. 방향과 가중치와 순환이 갈리는 자리, 그리고 왜 순환을 그렇게 찾아다니는지까지.

자료를 어떻게 담나 8편

힙과 우선순위 큐 - 제일 급한 것만 위로

CS · Data Structure

힙과 우선순위 큐 - 제일 급한 것만 위로

전부 줄 세우지 않고 꼭대기 하나만 약속한다. 덜 약속해서 싸지는 그릇이고, 이름이 같은 메모리의 힙과는 아무 관계가 없다.

자료를 어떻게 담나 7편

트리와 이진탐색트리 - 반씩 접어 들어간다

CS · Data Structure

트리와 이진탐색트리 - 반씩 접어 들어간다

스무고개가 백만 개를 스무 번에 줄이는 원리 그대로다. 다만 질문을 잘못 고르면 스무고개가 하나씩 세는 일이 된다.

자료를 어떻게 담나 6편

해시테이블 - 계산해서 자리를 정한다

CS · Data Structure

해시테이블 - 계산해서 자리를 정한다

찾지 않고 계산한다는 발상 하나로 O(1)이 나온다. 그 대신 충돌을 떠안고, 순서를 잃고, 가끔은 O(1)이 깨진다.

자료를 어떻게 담나 5편

스택과 큐 - 어느 쪽에서 꺼내나

CS · Data Structure

스택과 큐 - 어느 쪽에서 꺼내나

같은 더미인데 꺼내는 자리 하나만 바꿨다. 그 하나가 되돌리기와 작업 큐를 가르고, 스택 오버플로가 왜 나는지도 여기서 설명된다.

자료를 어떻게 담나 4편

배열과 연결리스트 - 자리를 미느냐 고리를 바꾸느냐

CS · Data Structure

배열과 연결리스트 - 자리를 미느냐 고리를 바꾸느냐

중간에 하나 끼워 넣을 때 한쪽은 뒤를 전부 밀고 한쪽은 고리 둘만 바꾼다. 그런데도 실무가 거의 배열을 쓰는 이유까지.

자료를 어떻게 담나 3편

빅오 - 몇 배로 늘어나나

CS · Data Structure

빅오 - 몇 배로 늘어나나

빅오는 어려운 수학이 아니라 늘어나는 모양에 붙인 이름이다. 사람이 두 배로 오면 무엇이 두 배가 되고 무엇이 네 배가 되는지로 읽는다.

자료를 어떻게 담나 2편

자료구조 - 담는 그릇이 속도를 정한다

CS · Data Structure

자료구조 - 담는 그릇이 속도를 정한다

자료구조는 빠른 것과 느린 것으로 나뉘지 않는다. 무엇을 싸게 하고 무엇을 비싸게 할지를 고르는 일이다. 그릇을 가르는 네 가지 질문부터 본다.

자료를 어떻게 담나 1편