[Effective C#] 아이템 44: 바인딩된 변수는 수정하지 말라
클로저에서 캡처된 변수를 수정하면 예상치 못한 문제가 발생할 수 있다.
클로저에서 캡처된 변수를 수정하면 예상치 못한 문제가 발생할 수 있다.
LINQ 라이브러리는 시퀀스를 반환하지만 단일 요소를 반환하는 메서드도 있다.
IEnumerable와 IQueryable 는 거의 동일한 API 정의를 가지고 거의 대부분 상호 교환이 가능하다. 하지만 항상 가능한 것은 아니며, 동작 방식과 성능에서 큰 차이가 난다.
클로저에 캡처된 지역변수는 수명이 늘어나고 선언된 범위를 넘어가도 가비지로 간주되지 않는다. 대부분의 경우 적절한 시점에 가비지로 수집되므로 신경쓸 것이 없다. 그러나 IDisposable을 구현한 무거운 리소스를 참조할 경우 신경써야 할 점들이 있다.
선언적 코드 (Declarative code) VS 명령적 코드 (Imperative code) 선언적 코드는 무슨 작업을 해야하는 지 정의하는 코드이고, 명령적 코드는 어떻게 작업을 수행해야 하는지를 단계별로 세분화 해서 기술하는 코드 이다.
일련의 값을 순차적으로 처리하는 코드가 중간에서 예외를 일으키면 상태를 복구할 수 없는 문제에 봉착한다.
다음 코드는 동일한 람다 표현식이 반복되는 경우이다.
쿼리를 정의하면 결과 데이터나 시퀀스를 즉각적으로 얻어오는 것은 아니다. 실제로 쿼리의 결과를 이용하여 순회를 수행해야만 결과가 생성된다. 이를 지연 평가 (Lazy Evaluation)이라고 한다.
C# 컴파일러는 쿼리 표현식을 메서드 호출 구문으로 변환해준다. 전체 쿼리 표현식 패턴에는 Where(), Select() 등 11개의 메서드가 포함되어 있다.
챕터 3의 아이템 27, 28에서 확장 메서드를 작성해야 하는 이유를 살펴보았다. 아이템 35는 확장 메서드를 사용하지 말아야 하는 경우이다.
컴포넌트 간의 계약 관계를 기술할 때에 베이스 클래스나 인터페이스를 사용한다. 또는 함수를 매개변수로 취하는 방식을 활용할 수도 있다.
yield return을 사용해서 시퀀스를 생성하면 사용되지 않을 요소를 미리 생성하는 것을 피할 수 있다.
이터레이터 메서드의 사용 방식에는 크게 두가지 유형이 있다. 시퀀스 내의 개별 항목을 이용하여 작업을 수행하는 유형 (Action, Predicate, Function) 시퀀스의 순회 방식에 변경을 주는 유형
시퀀스를 다루는 메서드는 C# 이터레이터를 활용하여 작성할 수 있으며 결과가 필요한 시점에 메서드가 수행되도록 할 수 있다.
쿼리 구문이나 메서드 호출 방식을 사용했을 때의 장점 가독성이 높아진다 개별 작업의 수행 시기를 연기할 수 있다
LINQ 개요 LINQ는 C# 3.0에 추가된 기능이다. LINQ는 지연된 쿼리를 지원한다. 다양한 저장소에 대해 쿼리를 수행할 수 있다. 쿼리 제공자를 자유롭게 구현할 수 있다.
아이템 27과 비슷하게 List, Dictionary<EmployeeID, Employee>와 같이 이미 구체화된 컬렉션 타입에 확장 메서드를 추가하여 새로운 기능을 추가할 수 있다.
인터페이스에서 정의하는 멤버들은 이를 구현하는 클래스에서 반드시 구현해야한다.
새로운 라이브러리를 개발할 때에 제네릭 타입뿐 아니라 고전적인 방식도 함께 지원하면 라이브러리의 활용도를 좀 더 높일 수 있다.
제네릭 클래스를 사용하는 대신 제네릭 메서드를 사용했을 때의 장점 각 메서드별로 제약 조건을 설정할 수 있다. 타입별로 특화된 메서드를 정의할 수 있다. 매개변수를 명시적으로 지정할 필요가 없다.
베이스 클래스나 인터페이스로 제네릭 메서드를 오버로딩할 경우, 명시적 형변환을 해줘야만 선택된다.
인터페이스를 선언하고 제약조건으로 설정하면 다양한 제약 조건을 설정할 수 있다.
공변성과 반공변성 공변성: X → Y 가 가능할 때, C → C 가 가능 반공변성: X → Y 가 가능할 때, C → C 가 가능 불변성: X → Y 가 가능하지만, C → C 와 C → C 모두 불가능
제네릭을 사용할 때에 타입이 IDisposable을 구현하고 있다면 리소스 누수가 발생할 수 있다.
IComparable IComparable 에는 CompareTo()라는 단 하나의 메서드가 정의되어 있다.
제네릭의 인스턴스화는 런타임의 타입을 고려하지 않고 컴파일 타임의 타입만을 고려한다.
C# 컴파일러는 제네릭 타입에 대해 올바른 IL을 생성해야 한다.
Effective C# Chapter 3 제네릭 개요
IDisposable 인터페이스를 상속 받고 Dispose 패턴을 구현하면 비관리 리소스를 안정적으로 관리할 수 있다.
생성자가 수행을 완료하기 전까지는 객체가 완전히 생성된 것이 아니다. 객체가 완전히 생성되지 않았을 때에 가상 함수를 호출하면 이상 동작을 일으킨다.
너무 많은 객체를 생성하고 제거하면 가비지 컬렉터가 많은 프로세스 시간을 사용하게 되고 이는 심각한 성능 문제를 일을킬 수도 있다.
생성자를 작성할 때에 동일한 코드를 반복적으로 사용해야 한다면 공용 생성자나 기본값을 갖는 매개변수를 취하는 생성자를 작성하면 좋다.
인스턴스 멤버 초기화와 마찬가지로 정적 멤버를 간단히 초기화하는 경우에는 멤버 초기화 구문을 사용하는 것이 좋다.
하나의 클래스에 여러 개의 생성자를 작성해야 할 때, 각각의 생성자에서 멤버 변수를 초기화 하는 것보다 멤버 초기화 구문을 사용하는 것이 좋다.
.NET 개발에 있어서 메모리와 주요 리소스들이 어떻게 관리되는지 알아야 한다.
new 한정자를 사용하면 베이스 클래스에서 정의한 메서드를 재정의할 수 있다. 그러나 virtual로 선언되지 않은 메서드를 재정의할 경우 매서드의 동작 방식이 모호해진다.
박싱: 값 타입 → 참조 타입 언박싱: 참조 타입 → 값 타입
이벤트 핸들러들을 결합시키면 이벤트를 한번에 호출할 수 있다. 그러나 결합되어 있는 이벤트 핸들러가 없는 경우에는 주의가 필요하다.
Delegate Delegate는 delegate 타입을 만들 때 사용되는 클래스이다. delegate 타입은 특정 형식의 메서드를 참조할 수 있는 타입이다. (인스턴스 메서드, 스태틱 메서드 모두 참조할 수 있다)
델리게이트를 이용하면 타입안정적인 콜백을 정의할 수 있다. 인터페이스를 사용할 때보다 클래스간의 결합도를 낮출 수 있다.
nameof()는 타입, 변수, 인터페이스, 네임스페이스의 심볼을 문자열로 대체해준다.
보간 문자열은 여러 형식으로 암시적 형변환이 가능하다. FormattableString을 사용할 경우 여러 문화권에 대응할 수 있다.
string.Format() 대신 보간 문자열을 사용하면 코드 가독성과 성능 면에서 이점이 있다.
아이템 3: 캐스트보다는 is, as가 좋다
const(컴파일타임 상수) 보다는 readonly(런타임 상수)를 사용하는 것이 좋다.
타입이 명시적으로 드러나야 하는 경우나 내장 숫자 타입 (int, float, double)을 선언하는 경우를 제외하고는 var를 사용하는 것이 좋다.
B형 실전 문제 풀이 최소값의 최대값을 구하는 전형적인 이분탐색 문제이다. 그러나 Price가 99자리수로 하나의 변수에 담기엔 너무 크다. 문자열 형태로 연산을 할 경우 연산 한번에 100번의 연산이 필요하므로 매우 비효율적이다. 따라서 price를 8개의 long ...
B형 실전 문제 풀이 User는 Array에 저장하고, Product는 pid를 기준으로 hash table에 저장하였다. 추가로 각각의 Area에 따라 Product들을 Heap으로 구성하였다. 실수 이중 for문에서 i 와 j 잘 구분하기.
B형 실전 문제 풀이 모든 텍스트는 8자 이하의 알파벳 소문자이므로 hash로 40bit에 1대1 대응시킬 수 있다. 따라서 unsiged long long 의 hash값을 이용하기로 했다. User와 Group은 각각 20개, 10개로 개수가 적으므로 배열로 저장하였다...
B형 실전 문제 풀이 도서의 제목을 저장한는 Trie와 분류를 저장하는 배열을 만든다. 분류는 3글자 이하이므로 Hash를 통해 1대1 대응시킬 수 있다. 또한 테스트케이스당 500개 이하의 분류가 존재하므로 구역의 수(100) * 분류의 수(500) 의 2차원 배열을 ...
B형 실전 문제 풀이 Graph와 Bucket을 이용했다. Graph와 Linked List를 이용해서 Edge를 만들면 Edge를 Delete할 때 해당 node의 모든 edge를 탐색하야하므로 시간초과가 난다. 그렇다고해서 N * N의 edge 배열을 만들기엔 N이 ...
B형 실전 문제 풀이 바꾸는 문자열이 3글자로 고정돼있으므로 Hash를 이용하면 1대1 매핑이 가능하다. 문자열의 크기 (50000), change 호출 횟수(50000) 을 고려하면 완전 탐색은 50000 * 50000 로 시간초과가 난다. 그래서 Hash Table을...
B형 실전 문제 풀이 Trie를 만들고 카운트(cnt), 밴 여부(ban), 추천 노드(best) 를 저장. input을 할 때마다 카운트를 1씩 더하고, 부모 노드를 순회하면서 best와 비교 및 교체. ban을 하면 ban을 true로 해서 추천되지 않도록 하고, 부...
Hash 기본문제 풀이 Rabin-Karp 알고리즘을 사용하여 그림의 해시값을 구하여 은기와 선생님의 그림을 비교한다. 먼저 가로의 해시값을 구하고 가로의 해시값으로 세로의 해시값을 구한다. 실수 가로와 세로에 같은 Hash function을 사용하면 전체 Hash f...
Hash 기본문제 풀이 Hash를 사용하지 않고 KMP 알고리즘을 사용했습니다. 참고: KMP : 문자열 검색 알고리즘 실수 테스트 케이스를 여러번 실행할 때에는 전역변수 초기화를 잘 해줄 것.
Hash 기본문제 풀이 첫번째 집합으로 Hash Table을 만든다. 두번째 집합의 문자열들이 Hash Table에 존재하는지 확인한다.
Divide-and-conquer(분할정복) 실전문제 풀이 최대값이 최소가 되도록 하는 문제는 대부분 Binary Search(이분탐색)으로 풀 수 있다.
Divide-and-conquer(분할정복) 실전문제 풀이 최대값이 최소가 되도록 하는 문제는 대부분 Binary Search(이분탐색)으로 풀 수 있다.
Trie 기본문제 풀이 이전 Trie 기본문제들과 동일하게 카운트를 가진 Trie를 구현함. 비교횟수는 탐색하면서 거쳐온 노드의 카운트의 합. 단어의 순서가 사전순이 아니라 입력순이기 때문에 사전에 단어가 존재할 경우는 입력 단계에서 답을 미리 구해놓아야함.
Trie 기본문제 풀이 K번째 접미어와 매우 유사함. Add할 때에 중복을 체크하는 코드만 추가.
Trie 기본문제 풀이 Trie를 구현하고, 각각의 노드에 해당 노드로 시작하는 단어의 개수(cnt)를 저장함. query함수는 해당 단어를 찾고, cnt를 반환. 해당 단어가 없을 경우 0을 반환
Trie 기본문제 풀이 Trie를 구현하고, 각각의 노드에 해당 노드로 시작하는 단어의 개수(cnt)와 해당 노드로 끝나는 단어의 존재 여부(end)를 저장함. 모든 단어를 Trie에 넣고, cnt가 K를 넘어가지 않도록 탐색.
Heap 기본문제 풀이 복구 시간을 기준으로 Min Heap을 만듦. 복구 시간이 최소인 지점(Pop)에서 상하좌우로 이동했을 경우 좌표와 복구 시간을 Min Heap에 넣어줌(Add) 이렇게 되면 복구 시간이 최소인 지점이 N-1, N-1 일때 복구 시간이 정답이 됨....
Heap 기본문제 풀이 참고: [알고리즘] SW Expert Academy 10806. 수 만들기
Heap 기본문제 풀이 Max-Heap과 Min-Heap을 이용해서 중간값을 실시간으로 구할 수 있습니다. Max-Heap과 Min-Heap을 따로 구현해주었습니다. MinHeap에는 MaxHeap[0]보다 큰 값들만 넣어주고 작은 값들은 MaxHeap에 넣어줍니다. ...
Heap 기본문제 풀이 배열로 힙 (Add, Pop) 구현하기.
Greedy 기본문제 풀이 단위가 큰 수부터 뺄 수 없을 때까지 빼면서 카운트.
Tree 기본문제 풀이 Tree 기본문제이지만 Tree를 만들 필요가 없음. 입력을 받는 단계에서 유효성 검사 가능. 노드가 연산자일 경우 두개의 자식 노드가 존재해야하고, 수일 경우 자식 노드가 없어야함. 노드의 인덱스 * 2 가 N 보다 작을 경우 두개의 자식 노드...
Tree 기본문제 풀이 기호, 숫자, 자식노드에 따라서 입력 형태가 바뀜. 따라서 문자열로 받아서 파싱. root 부터 재귀적으로 자식 노드 탐색 및 계산.
Tree 기본문제 풀이 자식 유무에 따라서 input 개수가 달라짐. cin.get() 함수로 줄바꿈 문자인지 체크. (cin.get()은 한문자씩 입력받고, 공백 문자나 개행 문자를 생략하지 않음.) Inorder 함수를 이용하여 in-order 형식으로 Tree 순...
DP 실전문제 풀이 M개의 봉지 B를 오름차순으로 정렬. dp[n][l][r][take] 설정. (현재 상태에서 최대 과자 개수) n은 N개의 봉지 중에서 n번째 봉지까지 확인한 상태. l은 M개의 봉지 중에서 l개를 가져간 상태. (항상 큰 봉지 먼저 가져감) r은...
DP 실전문제 풀이 F에 대하여 오름차순으로 정렬. dp[i][j] 는 i번째 문제까지 중에서 j개의 문제를 풀었을 때 걸리는 최소 시간. dp[i][j] = min(dp[i-1][j], dp[i-1][j-1] + S[i]) dp[i][j] > F[i] 일 경우,...
비트연산자 기본문제 풀이 int형 변수 check를 선언하여 숫자 하나당 1bit씩 할당. 10개의 bit이 모두 1이 될 때까지 체크.
비트연산자 기본문제 풀이 동아리원이 총 4명이므로 4비트로 모든 경우의 수를 표현할 수 있음. 0b0000부터 0b1111까지(0 부터 15까지) 1씩 더해가면 경우의 수를 체크하며 카운트.
문제 프로그래머스 2021 KAKAO BLIND RECRUITMENT 기출문제 광고 삽입
문제 프로그래머스 2021 KAKAO BLIND RECRUITMENT 기출문제 합승 택시 요금
문제 백준 삼성 SW 역량테스트 기출 문제 16234: 인구 이동
문제 백준 삼성 SW 역량테스트 기출 문제 5373: 큐빙
문제 백준 삼성 SW 역량테스트 기출 문제 15686: 치킨 배달
문제 백준 삼성 SW 역량테스트 기출 문제 15685: 드래곤 커브
문제 백준 삼성 SW 역량테스트 기출 문제 15683: 감시
문제 백준 삼성 SW 역량테스트 기출 문제 14891: 톱니바퀴
문제 백준 삼성 SW 역량테스트 기출 문제 14890: 경사로
문제 백준 삼성 SW 역량테스트 기출 문제 14889: 스타트와 링크
리그오브레전드 패치가 있을 때 마다(챔피언 추가, 아이템 변경 등) LoLog.me도 업데이트가 필요했습니다. 코드를 개선하여 1시간 마다 데이터가 자동으로 업데이트 되도록 했습니다.
Match-V5 에서 큐 타입 (솔랭, 자랭, 일반 등) 은 info 오브젝트의 queueId 필드에 나와있습니다.
Match-V4 에서 Match-V5 로 넘어가면서 gameDuration(게임 길이) 값이 초단위에서 밀리초단위로 변경되었습니다. 그러나 11.20 패치 이후로 다시 초단위로 돌아가게 되었고 gameEndTimestamp 라는 필드가 새로 생겨났습니다.
Riot API 의 Match-V4 지원이 종료되었습니다. 그래서 LoLog.me 서버를 Match-V5 에 맞게 업데이트했습니다.
LoL Discord Node.js기반 디스코드 봇을 위한 롤 전적 검색 모듈을 배포하였습니다. 데이터는 LoLog.me에서 가져옵니다.
LoLog.me 에서 이제 챔피언에게 가한 피해량 그래프를 확인할 수 있습니다. 모바일 반응성이 향상되었습니다.
LoLog.me 에서 이제 최근 전적을 한눈에 볼 수 있고, 승률 통계를 확인할 수 있습니다.
LoLog.me 에서 이제 개별 전적을 조회할 수 있습니다. 유저들에게 가장 친숙한 리그오브레전드 게임 클라이언트의 매치 히스토리 UI를 본따서 제작하였습니다. 그리고 유저들이 궁금해할 만한 정보들을 추가했습니다. 또한 닉네임을 클릭하면 해당 유저를 바로 검색할 수 있습니다.
LoLog.me 사이트를 제대로 만들어 보겠다는 포스트를 업로드한 후로 딱 한달이 지났습니다. 그동안 업데이트한 내용들을 정리해볼까 합니다.
Riot API의 Match-V4의 리턴값 중에서 PlayerDto 안에 ‘matchHistoryUri’라는 값이 있습니다. 이 값을 어디에 사용할 수 있을까요?
며칠전 신청했던 Riot API Production Key 발급이 승인되었습니다! 이제 LoLog.me 를 지속적으로 서비스할 수 있게 되었습니다. 신청서를 제출하고 승인이 되기까지 3-4일 정도 시간이 걸렸습니다. 생각보다 빠르게 돼서 놀랐네요 ㅎㅎ
Riot API로 공개서비스를 제공하기 위해서는 제품을 등록하고, Production API Key를 발급받아야 합니다.
웹프로그래밍 공부할 겸, 롤 전전검색 사이트를 만들어봤습니다. LoLog.me
리그오브레전드를 해봤다면 OP.GG, YOUR.GG 등 전적검색 사이트를 이용해본 경험이 있을 겁니다. 전적검색 사이트들은 Riot에서 제공하는 Riot API를 이용하여 유저들의 정보를 가져옵니다. Riot API를 이용해서 저만의 롤 전적검색 사이트를 만들어 보려합니다. ...
PM2를 사용할 때에 Configuration File 을 생성해놓으면 여러 프로세스들을 한번에 실행할 수 있고, 옵션도 편리하게 추가할 수 있습니다.
--name
, --time
, --
, --max-memory-restart
)
앵무새봇을 배포할 때 사용하는 PM2 옵션입니다.
앵무새봇의 서버를 증설하기 위해 새로운 AWS EC2 인스턴스를 생성하였습니다. 서버에 nvm과 Node.js를 설치하고 프로젝트를 클론한 뒤에 npm install 명령어를 실행하였으나 Error: not found: make 오류가 뜨면서 모듈 하나가 설치되지 않았습니다.
Express로 만들어진 웹 사이트의 보안을 강화하기 위해 Helmet 미들웨어를 사용합니다.
Node.js를 이용하면 웹 크롤링을 간편하게 해볼 수 있습니다. 저는 crawler모듈을 사용하여 네이버 홈페이지를 크롤링해보겠습니다. GitHub에서 코드 미리보기 목표 네이버 메인페이지에서 언론사 리스트를 가져와 출력해보고자 합니다.
자바스크립트 코드는 서버에서 통채로 전송되어 브라우저에서 실행되므로 코드 자체의 크기를 줄이면 로딩속도를 향상시킬 수 있습니다.
Google Charts는 예전에 포스팅했던 Frappe Charts와 비슷한 기능을 하는 자바스크립트 차트 라이브러리입니다. 사용법도 거의 비슷하고, 구글에서 만든 모듈인지라 문서화가 잘 돼있습니다. Google Charts
Frappe Charts는 SVG 차트를 쉽게 만들게 해주는 오픈소스 모듈입니다. 여러가지 종류의 깔끔한 그래프들을 간편하게 만들 수 있습니다.
여러 회사에서 제공하는 jQuery CDN을 이용하면 jQuery를 쉽고 빠르게 이용할 수 있습니다.
이전 글에 이어지는 삼성전자 SW 알고리즘 역량테스트 B형 취득 후기입니다. 이번 글에서는 2번의 시험 중 두번째 시험을 치르면서 느낀 점을 정리해보았습니다.
이전 글에 이어지는 삼성전자 SW 알고리즘 역량테스트 B형 취득 후기입니다. 이번 글에서는 2번의 시험 중 첫번째 시험을 치르면서 느낀 점을 정리해보았습니다.
삼성전자 S/W 알고리즘 특강을 수강하여 운좋게 삼성전자 SW 알고리즘 역량테스트 B형(pro) 을 치를 기회를 얻었습니다. 2회의 기회가 주어졌고 저는 두번째 테스트에서 통과하여 B형을 취득하였습니다.
2021.07.19 ~ 2021.08.27 6주간 삼성전자 하계 알고리즘 역량강화 특강에 참여하고 수료하였습니다. 이 과정은 삼성전자 SW 역량테스트 B형(Pro) 를 취득하는 것을 목표로 구성된 프로그램입니다. 교육 기간이 종료된 이후에 SW 역량테스트 B형에 응시할 수 있는...
그 게임, 내가 만들었어요 저자: 이진희 출판사: 행성B 발행일: 2022.07.01 (초판 1쇄 발행)
레버리지 (Life Leverage) 저자: 롭 무어 출판사: 다산 북스 발행일: 2022.06.22 (양장특별판 18쇄 발행) / 초판 1쇄 발행: 2017.05.08
이펙티브 엔지니어 - 개발자의 인생을 바꾸는 효율성의 법칙 (The Effective Engineer) 저자: 에드먼드 라우 출판사: 길벗 발행일: 2022.06.27 (초판 발행) / 원서: 2015.03
액티브 리딩 - 즉시 행동하는 사람의 독서법 (SECRETS OF ACTIVE READING SKILLS) 저자: 쓰카모토 료 출판사: 시원북스 발행일: 2022.07.18 (초판 1쇄 발행) / 원서: 2019.01 읽은 날: 2022.07.22 - 2022....
리눅스 환경에서는 터미널에서 GCC를 쉽게 설치하고 사용할 수 있습니다. 그러나 윈도우에서는 다소 번거로운 작업이 필요합니다. 윈도우 cmd(명령 프롬프트)에서 GCC를 사용할 수 있도록 세팅을 하고 VS code에서 f5키를 눌렀을 때 디버그가 실행되도록 설정해봅시다.
VS Code 에서 제가 많이 사용하는 단축키들입니다.
GitHub에 REAMDME 파일을 작성할 때 Jekyll을 이용하여 GitHub Page를 만들 때 Markdown(.md)을 사용합니다. 이를 작성과 동시에 미리보고자 합니다.
리눅스의 경우 pm2 save와 pm2 startup 명령어를 사용해 재부팅시 pm2가 자동 실행되도록 할 수 있습니다. 그러나 pm2 startup 명령어는 아직 Unix 계열 운영체제에서만 작동합니다. 대신 윈도우 서버에서는 AWS EC2의 사용자 데이터 스크립트 기능을...
밤사이 저의 AWS EC2 서버가 터졌습니다. 아쉽게도 사용자가 많아 터진 것은 아니었습니다… ㅎ
AWS Console에 로그인할 필요 없이 터미널에서 AWS EC2 Linux 인스턴스에 연결하거나 파일을 전송하는 방법입니다. 단, 인스턴스를 생성할 때 설정한 프라이빗 키(.pem)가 있어야 합니다.
지난번 포스트에서 만들었던 ‘이 카테고리의 다른 글’에 날짜를 추가하고 손가락 이모티콘을 사용하여 가독성을 높혔습니다.
방문자들이 관련 포스트를 쉽게 찾아갈 수 있도록 ‘이 카테고리의 다른 글’ 링크를 만들었습니다.
제 블로그는 Jekyll과 GitHub Page 로 구현되어 있습니다. Jekyll의 기본설정에 따라, 포스트의 url이 /카테고리/타이틀로 설정 되어있었습니다. 이게 맘에 들지않아 url을 제 임의로 수정하고 기존의 url이 404 not found를 띄우지 않도록 Redir...
쌓인 북마크 여기다 정리 후 삭제
이전 글에서 수학적으로 계산했던 오징어 게임 징검다리 건너기 참가자별 성공 확률을 코드로 구현하여 테스트해보았습니다.
넷플릭스 드라마 “오징어 게임” 의 5번째 게임은 “징검다리 건너기” 입니다. 18쌍의 강화유리와 일반유리로 이루어진 징검다리를 참가자 16명이 차례로 건너는 게임입니다. 변수가 없는 상황(유리 장인 X, 기억 못하는 경우 X)에서 각 참가자별로 성공할 확률이 얼마나 되는지 ...
AWS EC2 Linux 서버에서 GitHub id, password를 사용하여 git pull을 할 때마다 [GitHub] Deprecation Notice라는 제목의 메일이 왔습니다. id와 password를 통해 깃허브에 접근하는 것이 보안상의 이유로 곧 사용할 수 없게 ...
git subtree add를 이용하면, 하나의 repository 안에 다른 repository를 그대로 복사해올 수 있습니다. 이때, 기존의 commit log를 함께 복사해올 수 있습니다!
MySQL의 기본 데이터베이스인, INFORMATION_SCHEMA 의 TABLES 테이블에는 각각의 테이블에 대한 정보가 들어있습니다. SELECT 문으로 필요한 정보만 가져와보도록 하겠습니다.
MySQL에서 여러개의 INSERT 쿼리를 통합시켜 하나의 쿼리문으로 만들면 성능이 대폭 향상됩니다. (하나의 table에 대한 쿼리문일 경우)
블랜더로 모델링하고 렌더링한 로우폴리 치킨입니다. 이번에도 유튜버 까망고니님의 튜토리얼 영상을 참고하였습니다.
블랜더로 모델링하고 렌더링한 로우폴리 나무입니다. 튜토리얼을 따라가니 첫작품 치고 꽤나 만족스러운 결과가 나왔습니다.
의존성 주입(Dependency Injection, DI)란 객체들 간의 의존 관계를 외부(컨테이너)에서 생성해주는 것입니다.
Java를 처음 공부해보면서 객체 관련 내용들을 용어 중심으로 정리해 보았습니다.
next_permutation 함수는 위와 같이 사용하고 파라미터로 보내진 Iterator 범위 내의 원소들을 다음 경우의 수 배열로 만들어 줍니다. 이 때, 오름차순에서 내림차순으로 가는 경우의 수를 고려합니다. 즉, 오름차순으로 정렬된 배열에 next_permutation 을 ...