본문 바로가기
[피드백] - 일상 언어를 제대로 이해하자. (문제 해석 실패 사례) 컴퓨터로 문제를 해결할 때, 코딩테스트처럼 미리 전산학/컴퓨터공학적 개념으로 잘 정리된 문제라고 해도 어느 정도는 일상 언어를 통해 문제 사항이 기술된다. 여기서 프로그래머는 요구 사항을 정확하게 해석해야 한다. 이를 위해 커뮤니케이션이 필요하다. 아래는 내 실수다. 문제는 다음과 같다. N개의 사탕을 3명의 어린이에게 나눠주려고 한다. 최대한 공평하게 나누려고 한다. 공평함의 기준은 받는 사탕의 총 무게를 기준으로 가장 무거운 어린이의 사탕 무게와 가장 가벼운 어린이의 사탕 무게의 차이다. 사탕의 무게는 20이하의 정수로 주어진다. 가장 공평한 분배일 때의 무게 차이를 구하는 알고리즘은? 여기서 나는 나름 꽤 만족스런 해법을 고안했으나 결과적으로 완전히 틀린 대답이 되고 말았는데, 그 이유는 문제의 요.. 2024. 3. 25.
주어진 합을 가지는 특정 구간 구하기 문제. 수열과 어떤 값 하나가 주어진다. 구간의 합이 특정 값인 구간을 구하라. 이 문제를 풀기 위한 아이디어로 다음과 같이 생각했다. 1. 시간복잡도 시간복잡도는 적어도 O(N)이다. 절대로 이것보다 낮을 수는 없다. 구간의 "합"을 알아야 하므로 최악의 경우 수열의 전체 구간이 답이 될 수도 있기 때문이다. 2. 나에게 주어진 정보 보통 알고리즘의 Big-O가 N^2이나 N^3이 되는 이유는 불필요한 계산을 하기 때문이다. 불필요한 계산은 문제에서 주어진 정보나, 본인이 계산을 진행해가며 얻은 값들을 정보로 활용하지 않을 때 발생한다. 그래서 나에게 주어진 정보는 아래와 같았다. 문제에서 주어진 정보 = 구간의 값. 계산을 하며 얻을 수 있는 정보 = 0번째 배열부터 시작해 p 까지의 누적합. 3. .. 2024. 3. 20.
[컴퓨터의 기원] 2. 괴델의 불완전성 정리 1. 괴델의 아이디어에서 무엇이 혁신인가?1-1. 이전 내용 요약 컴퓨터의 본질과 기원에 대해 - 1. 힐베르트 프로그램1. 힐베르트 프로그램 1-1. 비유클리드 기하학과 러셀의 역설 1-1-1. 비유클리드 기하학의 등장 유클리드 기하학은 우리가 중학교에 입학하고 처음 배우는 바로 그 기하학과 관련이 깊다. 우리는linocraft.tistory.com괴델의 불완전성 정리를 시작하기 전에 잠깐 전에 했던 배경지식을 요약해보자. ● 수학이란 참이라고 받아들이는 명제(공리)들에서 다른 참인 명제(정리)를 논리적으로 추론하는 작업이다. 그러나 비유클리드 기하학의 등장으로 인해 우리가 직관적으로 타당하다고 넘기는 공리들이 사실은 거짓일 수도 있다는 것이 드러나고 말았다.● 결국 우리는 수학 체계의 기초라 할 수 .. 2024. 3. 17.
[컴퓨터의 기원] 1. 힐베르트 프로그램 1. 힐베르트 프로그램 1-1. 비유클리드 기하학과 러셀의 역설  1-1-1. 비유클리드 기하학의 등장 우리는 중학교 때 유클리드 기하학을 배운다. 이 과정에서 "수학을 한다". 그 전까지 배운 더하기나 빼기는 '수학'이 아니라 '산술'에 가깝다.우리는 기하학에서 어떤 기하학적 진술의 참을 증명해나가는 과정을 배운다. 예를 들어 "삼각형의 내각의 합은 180도이다."라는 명제가 있다. 이것을 기하학의 공리와, 공리에서 도출된 '정리'를 활용해 아래처럼 증명할 수 있다. 삼각형의 내각의 합이 180도인 이유(증명)초등학교 때 삼각형 모양의 색종이를 이용하여 삼각형의 세 내각의 크기의 합이 180도인 것을 배웠어요. 즉 아래의 그림에서처럼 삼각형의 세 각의 꼭짓점이 한 점에서 만나도록 이어 붙여보는susun.. 2024. 3. 17.
프로그래밍이 어려운 이유 - 프로그래밍이란 도대체 무엇인가? ※ 주의: 의역 있음 Why programming is hard In the office chill-zone otherwise known as the weeks around Christmas and New Year I was determined to crank out a bunch of high-quality… medium.com A computer is an idiot box. It can execute only the simplest of instructions natively, like: Add 42 to this number. (컴퓨터는 멍청한 상자다. 이 기계는 오직 "이 변수에 42를 더하라."와 같은 단순한 명령만을 이해한다.) Because of this limitation, every r.. 2024. 3. 13.
[티모시 골웨이의 이너 게임] - 어떻게 연습해야 하는가! 이너게임이너게임이란? 인간의 삶에서 학습은 무엇보다 중요한 과정이다. 우리는 학교나 학원에서, 교사나 코치로부터 바른 태도, 바른 자세, 바른 행동을 배운다. 과연 그런 것들을 배우고 익혀야 할까? 이 책의 저자는 그렇지 않다고 단언한다. 인간은 그를 잘 할 수 있는 지혜와 능력을 타고난다고 주장한다. 저자는 테니스를 지도할 때 자신이 보여주는 특정한 자세와 행동을 따르도록 강요하지 않았다. 그는 각 개인에게 잠재되어 있는 그 자신만의 리듬과 기술을 끌어낼 수 있는 코칭 방법을 찾아냈고 이를 ‘이너게임 원리’라고 이름 지었다. 이너게임 원리가 다양한 분야에 적용되다. 저자는 자신이 발견한 이너게임 원리를 ‘Inner Game of Tennis’ 라는 책으로 세상에 알렸다. 그 책은 뜻밖에도 베스트 셀러 .. 2024. 3. 8.
폰 노이만 구조의 혁신 폰 노이만 이전에도 컴퓨터는 있었다. 컴퓨터란 정보를 저장하고 처리하는 장치다. 물론 이 정의를 일반화하여 고대 중국의 주판을 컴퓨터라 할 수도 있다. 하지만 이 글의 논의에서 말하는 컴퓨터는 전자 컴퓨터를 말한다. 이런 관점에서 봤을 때, 최초의 컴퓨터는 존 모클리와 존 애커트가 1940년대에 개발한 애니악(ENIAC)이다. 문제는 에니악이 우리가 일반적으로 생각하는 범용 컴퓨터가 아니라는 점에 있었다. 이 때문에 에니악을 최초의 컴퓨터로 볼 수 없다는 시각이 현재는 주류의 의견이다. 우리가 컴퓨터에게 시키는 일은 알고리즘(계산 절차)을 통해 다양한 데이터 입력값에 대한 출력값을 얻는 것이다. 애니악은 철저하게 수소폭탄 궤적을 위한 알고리즘만을 수행할 수 있었다. 다양한 입력값에 해당하는 수소폭탄의 궤.. 2024. 3. 5.
[JPA] - 지연 로딩이어도 연관관계의 엔티티가 Null은 아니다. 1. 문제 의식 지연 로딩(링크)이 설정된 엔티티를 가져오는 경우,Transaction 범위 내에서 연관관계에 있는 엔티티를 구체적으로 요청하지 않는 이상 내부 엔티티 로딩은 지연된다. 예를 들어, 아래의 엔티티가 있다. @Entity public class Reply { @Id @GeneratedValue(GenerationType.INDENTITY) private Long rno; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_bno") priate Board board; } 이 엔티티를 가져오는 아래의 코드에서는 Reply 엔티티 내부의 Board 객체는 지연 로딩으로 설정되었으므로 DB처리가 되지 않을 것이다. public class .. 2024. 1. 29.
[Model Mapper] - DTO와 Entity 변환 시 내부에 객체를 매핑하고 싶을 때 Model Mapper Deep 매핑 방법?? MVC 패턴에서 컨트롤러와 뷰, 모델 사이에는 DTO라는 데이터 박스를 사용해 데이터를 한꺼번에 전달한다. 이는 컨트롤러와 서비스에서도 마찬가지인데, 이렇게 해야 웹 레이어와 서비스 내부(도 linocraft.tistory.com 전에 품었던 의문을 해결했다. 결론적으로 Model Mapper는 내부의 객체까지 전부 자동으로 매핑해준다. 그러나 여기에는 두 가지 조건이 있는 것으로 확인했다. ( ※ Entity 클래스에는 절대 setter를 쓰지 않아야 한다. setter를 쓰지 않아도 잘 동작하며, 논리적으로도 엔티티는 DB에서 가져온 시점에서 불변이어야 앞뒤가 맞다. service 단에서 엔티티의 내부 값을 setter를 통해 자유롭게 변동하는 것을 허용.. 2024. 1. 29.