CHAAANY ARCHIVE

전체 글

568개의 기록을 주제별로 둘러보세요.

해시 테이블에서 서로 다른 키가 같은 자리에 오면?

주문 번호를 입력하면 주문을 바로 찾을 수 있게 저장하려 한다. 번호 10과 18을 각각 다른 주문에 붙였다. 저장 칸이 여덟 개이고 번호를 8로 나눈 나머지를 칸 번호로 쓰면 둘 다 2번 칸에 간다. 뒤의 주문을 넣으면 앞의 주문이 사라질까?해시 테이블(hash table)은 키를 계산해 저장 위치를 찾는 자료구조다. 해시 함수(hash function)는 키를 숫자로 바꾸고, 그 숫자를 저장 칸의 범위에 맞춰 줄인다. 서로 다른 키가 같은 칸에 닿는 일을 충돌(collision)이라고 한다. 저장할 수 있는 키가 칸보다 많다면 충돌 자체를 없앨 수 없다. 중요한 것은 충돌한 키를 구분해 두 값을 모두 찾게 하는 규칙이다.같은 칸이라고 같은 키는 아니다번호 10과 18을 8로 나누면 나머지는 둘 다 2..

다산처럼 읽고 연암처럼 써라 — 글쓰기의 시작은 마음과 관찰

무슨 말을 하려는지 분명하지 않으면 문장을 아무리 다듬어도 글이 흐려진다. 반대로 하고 싶은 말이 있어도 대상을 자세히 보지 않으면 익숙한 말만 되풀이하기 쉽다. 글을 쓰기 전에 마음을 갖추고 사물을 살피는 일이 필요한 이유다.간호윤의 《다산처럼 읽고 연암처럼 써라》를 읽고 있다. 초반의 ‘마음 갖기’와 ‘사물 보기’에서는 글을 쓰기 전의 태도를 다룬다. 오늘 읽은 제1계부터 제4계는 마음을 가다듬는 일에서 출발해, 익숙한 생각을 벗어나 주변을 자세히 보는 일로 이어진다.글자를 고르기 전에 뜻부터 세운다제1계 ‘소단적치’에서는 글자를 병사에, 뜻을 장수에, 제목을 적국에 빗댄다. 글쓰기를 나라를 다스리는 일과 연결하는 비유다. 장수가 병사를 이끌듯 글에서도 뜻이 글자를 이끌어야 한다고 읽을 수 있다. 쓸..

TCP 연결은 어떻게 시작하고 끝날까?

브라우저가 서버에 요청을 보내려면 먼저 연결을 만들어야 한다. 연결을 열었다는 말은 양쪽 프로그램이 상대 주소만 알게 됐다는 뜻이 아니다. 어느 바이트부터 보낼지, 어디까지 받았는지, 더 보낼 데이터가 있는지를 서로 다른 시점에 기록한다.전송 제어 프로토콜(Transmission Control Protocol, TCP)은 네트워크에서 빠지거나 순서가 바뀐 바이트를 다루며 양쪽 프로그램에 순서 있는 바이트 흐름을 제공한다. TCP 연결은 시작·데이터 교환·종료에 따라 상태가 바뀐다. 이 상태를 따라가면 ‘연결이 끊겼다’는 한 문장 뒤에 어떤 차이가 있는지도 보인다.시작할 때 세 번 주고받는 까닭클라이언트가 연결을 요청하며 SYN을 보낸다. 서버는 요청을 받았다는 확인과 자신의 시작 번호를 담아 SYN/AC..

배열과 연결 리스트는 값을 끼워 넣을 때 무엇이 다를까?

주문 네 건이 접수 순서대로 놓여 있다. 두 번째와 세 번째 주문 사이에 빠졌던 주문 한 건을 넣어야 한다. 겉으로는 목록 한 칸만 바꾸는 일처럼 보인다. 컴퓨터 안에서는 어디를 얼마나 고쳐야 할까?배열(array)은 같은 크기의 칸을 연속해서 두고 번호로 원하는 칸을 찾는 자료구조다. 연결 리스트(linked list)는 각 항목이 다음 항목의 위치를 가리키도록 이어 놓은 자료구조다. 둘 다 순서가 있는 목록을 나타낼 수 있지만, 원하는 항목에 도달하는 방식과 중간에 값을 넣는 방식이 다르다.배열은 뒤쪽 값을 밀어 자리를 만든다배열에 [10, 20, 30, 40]이 들어 있다고 하자. 20 뒤에 25를 넣고 기존 순서를 지키려면 30과 40을 한 칸씩 뒤로 옮긴다. 새 자리가 생긴 뒤 그곳에 25를 쓴..

육아휴직 10주차, 아기 첫 이발과 백일 풍선

육아휴직 10주차.이번 주에는 아기의 배냇머리를 처음 잘랐다. 일요일에 가족들을 만나러 갔더니 아기 백일을 축하하는 풍선도 붙어 있었다. 중간에는 누수 메모를 받고 보험을 알아보느라 머리가 아팠지만, 친구들도 만나고 수영과 러닝도 했다.집에 놀러 온 친구, 시흥집에서 지낸 밤10월 5일 월요일에는 아내의 절친이 집에 놀러 왔다. 점심에는 엽떡에 치즈만두를 추가해 먹었다. 엽떡은 정기적으로 먹어줘야 하는데 한 번 먹었으니 당분간 쿨타임을 돌려야겠다. 친구가 아기를 엄청 예뻐해줘서 나도 기분이 좋았다. 아내와 친구가 둘만의 시간을 보낼 수 있게 나는 아기와 집을 지켰다. 저녁 7시쯤 러닝을 다녀왔는데 새벽까지 잠이 오지 않아 바둑을 뒀다.화요일에는 저녁에 시흥집에서 제사가 있어 낮 동안 아기를 돌봤다. 틈틈..

육아휴직 9주차, 안동에서 돌아와 수영을 시작했다

육아휴직 9주차.안동에서 며칠 더 머물다가 부천으로 돌아왔다. 아기와 함께 탈춤 축제도 다녀오고, 혼자 온천에서 푹 쉰 뒤 저녁에는 아내와 같이 뛰었다. 돌아와서는 수영을 시작했다.온천에서 푹 쉬고, 아내와 함께 러닝9월 28일 월요일 오전에는 아내와 장모님이 학가산 온천에 가셔서 점심때까지 아기와 단둘이 있었다. 돌아온 아내와 미리 사둔 불닭볶음탕면 두 개, 피자를 먹었다. 아내는 요즘 핫하다는 미역국에 불닭볶음탕면을 끓였고 나는 오리지널로 먹었다. 내 입맛에는 오리지널이 더 나았다.나도 온천이 궁금했고 몸도 피곤해서 혼자 차를 끌고 학가산으로 갔다. 거의 2시간 반에서 3시간 동안 모든 탕을 돌아다녔다. 따뜻한 물에 들어가자마자 피로가 쫙 풀렸다. 물줄기로 마사지하는 곳도 잘 되어 있어서 무료로 마사..

서버 주소를 바꿨는데 왜 어떤 사람은 아직 옛 서버로 갈까?

예를 들어 서비스를 새 서버로 옮겼다. 도메인 설정도 새 주소로 바꿨다. 내 컴퓨터에서는 새 화면이 열리는데 다른 사람은 한동안 옛 화면을 본다. 설정이 저장되지 않은 걸까?도메인 이름 시스템(Domain Name System, DNS)은 사람이 쓰는 이름에 연결된 주소 같은 정보를 여러 서버에 나눠 보관하고 찾는 체계다. 사용자가 매번 원본 서버에 물어보지 않도록 중간에 얻은 답을 저장한다. 도메인 설정을 바꾼 시각과 모든 사용자가 새 주소를 받는 시각이 같지 않은 이유가 여기에 있다.주소를 누가 기억하고 있을까www.example.com의 주소를 찾는 요청은 브라우저와 운영체제의 기록을 먼저 확인할 수 있다. 거기에 답이 없으면 인터넷 서비스 제공업체나 회사에서 설정한 재귀 리졸버(recursive ..

6원을 만드는 동전 두 개를 어떻게 찾아낼까?

앞 글에서 동전 1, 3, 4로 금액 6을 만들었다. 큰 동전부터 고르면 4+1+1로 세 개가 필요하지만 3+3이면 두 개다. 반례는 찾았다. 이제 동전 값이나 금액이 바뀌어도 최소 개수를 구하려면 어떻게 해야 할까?동적 계획법(Dynamic Programming, DP)은 같은 작은 문제의 답을 여러 번 계산하지 않도록 저장하고, 그 답들을 이용해 더 큰 문제를 푸는 방법이다. 동전을 고르는 순서를 전부 나열하기 전에 ‘금액 1을 만들려면 몇 개가 필요한가’, ‘금액 2는?’처럼 금액별 답을 적어 볼 수 있다.표의 한 칸은 무엇을 뜻하나표의 각 칸을 ‘그 금액을 만드는 데 필요한 최소 동전 수’라고 정하자. 아무 동전도 쓰지 않고 0을 만드는 방법은 있으므로 0번째 칸은 0이다. 아직 만들 방법을 못 ..

주문은 저장됐는데 결제 응답이 없으면 무엇을 믿어야 할까?

주문 버튼을 눌렀다. 주문 서비스는 주문을 저장했고 결제 서비스에도 청구를 보냈다. 그런데 답이 오기 전에 연결이 끊겼다. 화면에는 오류가 떴지만 결제가 실제로 실패했다고 말할 수 있을까?결제 서비스가 청구를 끝낸 뒤 응답만 잃어버렸을 수도 있다. 주문 기록을 지우고 처음부터 다시 결제하면 두 번 청구할 위험이 생긴다. 반대로 결제가 됐다고 가정하고 배송을 시작하면 돈을 받지 못한 주문을 처리할 수 있다. 응답을 못 받은 상태와 작업이 실패한 상태는 다르다.한쪽에서 끝난 일을 다른 쪽에서 취소할 수 있을까트랜잭션(transaction)은 여러 데이터 변경을 함께 확정하거나 모두 취소하는 작업 단위다. 주문 데이터베이스 안에서 주문 행과 주문 상품 행을 함께 저장하는 일은 하나의 로컬 트랜잭션으로 묶을 수..

지금 가장 좋아 보이는 선택을 계속하면 답도 가장 좋아질까?

해야 할 일의 시작·종료 시간이 제각각일 때 서로 겹치지 않게 최대한 많이 고르려 한다. 가장 짧은 일을 먼저 고르면 될까? 가장 일찍 시작하는 일을 먼저 고르면 될까? 둘 다 그럴듯하지만, 뒤에 남길 수 있는 시간을 보지 않으면 좋은 답을 놓칠 수 있다.그리디 알고리즘(greedy algorithm)은 매 단계에서 당장 좋다고 정한 선택을 확정하고, 이전 선택을 되돌리지 않는 방법이다. 빠르게 선택할 수 있다는 장점이 있지만 그때 좋아 보이는 선택이 끝까지 좋은 결과로 이어지는지는 문제마다 확인해야 한다.겹치지 않는 일을 많이 고르려면일마다 시작 시각과 종료 시각이 있다. 앞 일이 끝나는 시각과 다음 일이 시작하는 시각이 같으면 겹치지 않는다고 하자.A: 1시~4시 B: 3시~5시 C: 0시..

서버를 늘리면 데이터도 저절로 고르게 나뉠까?

주문 데이터를 서버 한 대에 담다가 저장 공간과 요청량이 늘어 두 대로 나누기로 했다. 주문 번호의 짝수와 홀수를 갈라 놓으면 일단 각 서버에 들어가는 주문 수는 비슷할 수 있다. 그런데 한 판매자의 주문 조회가 하루 종일 몰린다면 서버 두 대의 바쁜 정도도 비슷해질까?데이터의 개수를 고르게 나누는 것과 실제 일을 고르게 나누는 것은 다르다. 어디에 저장할지 정하는 규칙, 어떤 요청이 자주 오는지, 서버를 더 늘릴 때 무엇을 옮길지를 함께 봐야 한다.무엇을 기준으로 나눌까파티션(partition)은 데이터를 나눠 저장하고 관리하는 단위다. 어떤 파티션에 넣을지 판단할 때 쓰는 값을 파티션 키(partition key)라고 한다. 주문 번호를 키로 잡으면 주문 한 건을 찾을 때는 위치를 계산하기 쉽다. 반..

연결된 곳을 찾을 때 가까운 곳부터 볼까, 한 길을 끝까지 갈까?

역에서 다른 역까지 몇 번 갈아타야 하는지 찾는다고 하자. 출발역과 바로 연결된 역부터 살핀 뒤 그다음 역을 보면 가장 적은 이동 횟수를 찾을 수 있다. 반면 연결된 역을 하나씩 끝까지 따라가면 어딘가에 도달할 수 있는지 살피기는 좋지만, 처음 찾은 길이 가장 짧다고 말할 수는 없다.대상과 대상 사이의 연결을 나타내는 자료구조를 그래프(graph)라고 한다. 역은 정점(vertex), 두 역 사이의 연결은 간선(edge)으로 표현한다. 같은 연결 정보를 두고도 어떤 순서로 방문하느냐에 따라 먼저 얻는 답이 달라진다.‘연결됐다’의 뜻부터 정해야 한다다음 연결을 보자. 여기서는 화살표 방향으로만 이동할 수 있다고 하자.A → BA → CB → DC → DD → EA에서 D로 가는 길은 A→B→D와 A→C→D..

728x90