반응형

전체 글 1418

[Novice Mid : 프로그래밍 연습] 시뮬레이션 : 날짜와 시간 계산 - Date to Date

★ "왜?" 라는 질문을 스스로에게 하면서 학습하자. 0. 문제 풀이 순서 논리적 순서 확정 관련 카테고리 혹은 문제 끌어오기 필요한 자료연산 리스트업 이에 제일 유리한 자료구조 선택 구현 1. 설명 문제 링크 : https://www.codetree.ai/missions/5/problems/date-to-date?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요. www.codetree.ai 문제 사진 : 문제 설명 : 11년 m1월 d1일에서 m2월 d2일 까지 몇 일의 시간이 흘렀는지 계산하는 문제이다. 나의 ..

[Novice Mid : 프로그래밍 연습] 시뮬레이션 : 날짜와 시간 계산 - Time to Time

★ "왜?" 라는 질문을 스스로에게 하면서 학습하자. 0. 문제 풀이 순서 논리적 순서 확정 관련 카테고리 혹은 문제 끌어오기 필요한 자료연산 리스트업 이에 제일 유리한 자료구조 선택 구현 1. 설명 문제 링크 : https://www.codetree.ai/missions/5/problems/time-to-time?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요. www.codetree.ai 문제 사진 : 문제 설명 : 11년 11월 11일 a시 b분에서 c시 d분 까지 몇 분의 시간이 흘렀는지 계산하는 문제이다...

[코드트리 챌린지] 9월 3주차 인증용 포스트 🥺..

실력 진단 학습을 하는데 점수가 떨어지는 사람이 있다.. 뿌슝빠숑..? 상실감 무엇.. 잘하려고 해도 잘해지지가 않는 코딩 테스트가 밉다.. 😫 학습 내용 이번 주 학습내용 본문은 아래의 링크로 대체한다. 1. https://shung2.tistory.com/1399 [Novice Mid : 프로그래밍 연습] 정렬 : 객체 정렬 - 정렬된 숫자 위치 알아내기 ★ "왜?" 라는 질문을 스스로에게 하면서 학습하자. 0. 문제 풀이 순서 논리적 순서 확정 관련 카테고리 혹은 문제 끌어오기 필요한 자료연산 리스트업 이에 제일 유리한 자료구조 선택 구현 1. 설 shung2.tistory.com 2. https://shung2.tistory.com/1400 [Novice Mid : 프로그래밍 연습] 정렬 : 객체..

Part 4-3-7. 네트워크 프로그래밍 : Session #3 (Send 개선)

네트워크 프로그래밍 지난 시간에서 우리는 새로운 클래스인 Session을 만들어 소켓 프로그래밍의 Receive 부분과 Send 부분을 분리하여 작업을 진행했다. 오늘은 이어서 Send 부분의 코드 로직을 조금 더 우아하게 사용하기 위해 개선할 것이다. Send 개선 class Session { Socket _socket; int _disconnected = 0; object _lock = new object(); Queue _sendQueue = new Queue(); List _pendinglist = new List(); SocketAsyncEventArgs _recvArgs = new SocketAsyncEventArgs(); SocketAsyncEventArgs _sendArgs = new So..

Part 4-3-6. 네트워크 프로그래밍 : Session #2 (Send 분리)

네트워크 프로그래밍 지난 시간에서 우리는 새로운 클래스인 Session을 만들어 소켓 프로그래밍의 Receive 부분을 분리하여 작업을 진행했다. 오늘은 이어서 Send 부분을 분리하여 비동기로 처리할 것이다. Send 비동기 처리 구현 Send는 Receive 와는 다르게 언제, 어디서, 얼마의 버퍼(Buffer)의 크기를 사용하여 보낼지 모르기 때문에 기존 구조와는 다르게 비동기 처리 구현이 필요하다. Send의 동작 구조는 기존의 Receive의 동작 구조와 유사하다. 하지만 Start 메서드에서 SocketAsyncEventArgs 클래스를 이용해 소켓을 생성했던 기존의 Receive와는 달리 Send에서는 이벤트만을 연결해 줄 것이다. 왜 이렇게 처리해야 할까? 기존의 Receive 동작 구조는..

[Novice Mid : 프로그래밍 연습] 정렬 : 객체 정렬 - 줄 세우기 2

★ "왜?" 라는 질문을 스스로에게 하면서 학습하자. 0. 문제 풀이 순서 논리적 순서 확정 관련 카테고리 혹은 문제 끌어오기 필요한 자료연산 리스트업 이에 제일 유리한 자료구조 선택 구현 1. 설명 문제 링크 : https://www.codetree.ai/missions/5/problems/line-up-students-2?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요. www.codetree.ai 문제 사진 : 문제 설명 : 기존의 줄세우기 1번 문제와 유사하다. 키가 더 작은 학생이 앞에 오고, 키가 동일하..

[Novice Mid : 프로그래밍 연습] 정렬 : 객체 정렬 - 정렬된 숫자 위치 알아내기

★ "왜?" 라는 질문을 스스로에게 하면서 학습하자. 0. 문제 풀이 순서 논리적 순서 확정 관련 카테고리 혹은 문제 끌어오기 필요한 자료연산 리스트업 이에 제일 유리한 자료구조 선택 구현 1. 설명 문제 링크 : https://www.codetree.ai/missions/5/problems/indices-of-sorted-array?&utm_source=clipboard&utm_medium=text 코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요. www.codetree.ai 문제 사진 : 문제 설명 : 양의 정수를 원소값으로 갖는 길이가 N인 수열이 입력으로 주어졌을 때 해당 ..

Part 4-3-5. 네트워크 프로그래밍 : Session #1 (Receive 분리)

네트워크 프로그래밍 우리는 이전 시간에 Accept를 비동기 함수로 변경했다. 그래서 해당 로직이 AcceptAsync 👉 RegisterAccept 👉 OnAcceptCompleted를 왔다갔다 하면서 호출이 되게끔 했다. 그러나 이 함수를 자세히 보면 '혹시 RegisterAccept 메서드 내 pending의 값이 false 처리가 되어 재귀적으로 뺑뺑이를 돌다 스택 오버플로우가 일어나지 않을까?'라는 의문이 들 수 있다. 그리고 이는 이론상으로는 가능하다. 하지만 이는 현실적으로는 일어날 수 없다. 왜냐하면 우리는 Init() 메서드 내부에서 Listen의 값을 10으로 설정해주었기 때문이다. 따라서 동시 다발적으로 pending의 값이 false로 뜨는 것은 현실적으로 일어날 수 없다. 또 현재..

Part 4-3-4. 네트워크 프로그래밍 : Listener

네트워크 프로그래밍 현재 모든 코드가 Main 함수 내부에서 동작하므로 서버 코어 프로젝트 내에 리스너 클래스를 새로 생상하여 기존 코드들을 정리해주자. 리스너 클래스가 하는 일은 서버-클라이언트가 연결할 때에 사용할 소켓의 생성, 결합, 대기, 승인들의 작업을 리스너에서 처리한다. 즉 Block 함수로 사용되던 부분을 Non-Block 함수 형태로 변경하는 것이다. 왜 Non-Block 함수 형태로 수정해야 할까? 이는 지난 시간에 짤막하게 언급한바와 같다. Listener의 Accept() 메서드와 같은 함수들은 서버에서 실행하게 될 경우 클라이언트의 입장 요청이 들어오기 전 까지 값을 영영 리턴하지 않고 기다리게 된다. 따라서 우리가 기껏 만들어놓은 메인 쓰레드는 계속 일을 해야 하는데, Accep..

Part 4-3-3. 네트워크 프로그래밍 : 소켓 프로그래밍 입문

네트워크 프로그래밍 이론 오늘은 소켓 프로그래밍에 대해서 알아보는 시간을 가져보도록 하자. 그렇지만 다짜고자 바로 코딩을 시작하면 어렵기 떄문에 프로그램의 어떻게 동작하는지 전체적인 흐름을 알아보자. 😋 손님 가게 가게에 방문하고 싶은 손님 입구 만들기, 문지기 고용 - 문지기 교육 입장 문의 영업 시작 소통 (직원) 안내 (소통) 손님은 본인이 가게에 방문하는 것이 아닌 대리자를 통해 가게를 방문한다. 핸드폰을 통해 식당 번호로 입장 문의를 하고, 가게는 문지기를 통해 손님의 요청을 받을지 말지 결정하고, 만약 받게 되다면 가게 내부로 안내하게 되며 서로 소통이 가능한 상태가 된다. 이러한 상황을 소켓 프로그래밍에 대입하면 아래와 같은 구조가 된다. 즉 클라이언트가 손님의 역할을 맡고, 가게가 서버의 ..

Part 4-3-2. 네트워크 프로그래밍 : 통신 모델(OSI 7 계층)

네트워크 프로그래밍 통신 모델에 대해서 알아보자. 컴퓨터 공학을 배웠다면 이는 OSI 7 계층에 해당하는 개념이다. 다시 예제를 살펴보자. 우리는 지난 시간에 택배 예제를 학습하며 같은 단지, 다른 단지 내에서 전송할 때에 어떻게 해야 하는지 학습했다. 그러나 사실 택배를 어떻게 보낼 지에 대한 방법이나, 무엇을 보낼지, 어덯게 보낼지에 대한 방법은 하나도 생각하지 않은 것이다. 따라서 택배를 보낸다면 아래와 같은 추가적인 정책이 필요하다. 이를 네트워크 단계로 다시 표현하자면 상품은 어플리케이션 단계와 같다. 이는 유저 인테페이스를 정의하는 것이다. 웹 통신을 사용하면 HTTP, 파일 다운로드를 한다면 FTP 등을 사용하는 것이다. 배송 정책은 트랜스포트 단계와 같다. 전송을 어떻게 확인하고 오류를 처..

Part 4-3-1. 네트워크 프로그래밍 : 네트워크 기초 이론

네트워크 프로그래밍 멀티쓰레드 프로그래밍이 모두 마치고 네트워크 프로그래밍으로 파트로 넘어왔다! 😎 사실 클라이언트 개발자는 네트워크 분야까지 알아야 할 필요성은 없지만 우리는 서버를 사용해야하기 때문에 네트워크까지 학습한다. 따라서 서버의 안전성 및 보안 등을 관리해야 하기 떄문에 네트워크가 어떤 구조로 어떻게 이루어져 있는지 알 필요가 있다. 고로 기초적인 네트워크 지식이 필요하다. 네트워크 패킷을 보내는 방식은 택배를 보내는 방식과 매우 유사하다. 우리가 택배를 보내려고 하는데, 받는 사람이 같은 아파트 단지 내에 있는 사람이라면 받는 사람의 집까지 찾아가서 택배를 놓고 오면 된다. 그러나 이 방법은 아파트 단지 내에 호수가 많아지면 문제가 생긴다. 같은 아파트 단지여도 여러 호수가 있어 받는 사람..

[코드트리 챌린지] 9월 2주차 인증용 포스트 😎

실력 진단 ... 짤 그대로다. 이번 주 회사 면접보러다닌다고 문제를 풀 시간이 없어서 Novice Mid 영역의 정렬 챕터를 끝내지 못했더니 시뮬레이션 파트를 공부하지 못해 점수를 전혀 올리지 못했다. 추석이 지나고 출근 전까지의 시간이 많이 비므로 열심히 코드트리 수강하며 시간을 보내야겠다. 학습 내용 이번 주 학습내용 본문은 아래의 링크로 대체한다. 1. https://shung2.tistory.com/1379 [Novice Mid : 프로그래밍 연습] 정렬 : 객체 정렬 - 줄세우기 ★ "왜?" 라는 질문을 스스로에게 하면서 학습하자. 0. 문제 풀이 순서 논리적 순서 확정 관련 카테고리 혹은 문제 끌어오기 필요한 자료연산 리스트업 이에 제일 유리한 자료구조 선택 구현 1. 설 shung2.tis..

Part 4-2-15. 멀티쓰레드 프로그래밍 : TLS(Thread Local Storage)

멀티 쓰레드 TLS(Thread Local Storage) 쓰레드마다 고유하게 접근할 수 있는 전역 변수. TLS는 왜 필요할까? PPT와 예제를 통해 알아보잣! 🤠 우리는 락을 이용해 화장실처럼 동시 다발적으로 사용해야 하는 공간을 자물쇠를 이용해 사용하는 방법에 대해서 알아보았다. 여기까지만 보면 아름답지만, 현실은 녹록치 않다. 왜냐하면 주방에서 일어나는 일, 결제, 손님 테이블에서 일어나는 일 모두 각각의 직원이 대략적으로 현재 상황이 어떻게 이뤄지고 있는지 알아야 되기 때문이다. 즉 위의 이미지의 화살표처럼 일이 일사천리로 수월하게 처리되는 것이 아니라는 것이다. 그렇다면 락을 이용해 경합이 일어날 만한 곳에 락을 잡으면 되지 않을까? 생각할 수 있다. 하지만 이도 녹록치 않다. 왜냐하면 직원들..

Part 4-2-14. 멀티쓰레드 프로그래밍 : ReaderWriterLock 구현 연습

멀티 쓰레드 ReaderWriterLock을 구현해보자! 먼저 소스코드가 길어질 수 있으므로 ServerCore의 새로운 스크립트를 Lock.cs로 만들어주자. namespace ServerCore { class Lock { int _flag; } } 새로운 플래그를 위와 같이 설정하자. 플래그는 int형 변수를 사용하기 때문에 32비트를 가지게 된다. 우리는 32비트의 구조를 이용하여 Write의 영역과 Read의 영역을 구분할 것이다. 맨 앞의 1번 비트는 사용하지 않는다. 왜냐하면 해당 값을 사용하게 되면 음수의 값을 사용하기 때문이다. 따라서 우리는 2번 비트부터 16번 비트까지는 WriteThreadID의 영역을 이용해 쓰레드 아이디를 저장하고, 17번 비트부터 32번 비트까지는 ReadCoun..

Part 4-2-13. 멀티쓰레드 프로그래밍 : ReaderWriterLock

멀티 쓰레드 복습! 🤠 락을 구현하는 때에는 3가지 방법이 있다. 1. 근성, 2. 양보, 3. 갑질. ❗ 근성은 계속 빙글빙글 lock을 돌며 대기하는 것이고, 양보는 잠시 쉬었다가 다시 와서 획득 시도를 요청하는 것이다. 마지막으로 갑질은 직원을 시켜 알려달라 요구하는 것이다. 일전에 얘기했던 것과 같이 3가지 방법 중 뭐가 가장 좋고, 나쁘다 라고 말할 수 없으며 각각의 장점이 각각의 단점을 보완하는 형태이기 때문에 본인에게 필요한 방법을 사용하기로 하자. 그 동안 사용했던 Lock Lock 👉 내부적으로 Monotor 클래스를 이용해 편리하게 사용 가능한 락이다. (상호배제) static object key = new object(); static void Main(string[] args) { ..

Part 4-2-12. 멀티쓰레드 프로그래밍 : 이벤트(AutoResetEvent, ManualResetEvent), 뮤텍스

멀티 쓰레드 이벤트(AutoResetEvent) 오늘의 주제는 이벤트를 이용한 락 구현이다. 이전 시간에서 직원을 새로 고용해서 직원에게 부탁하는 방법이 이에 해당한다. 그렇지만 사실 해당 직원은 식당 직원이 아닌 커널 레벨에 있는 식당 관리자에 해당하는 것이다 😲.. 이런 식으로 커널 레벨로 옮겨서 실행을 할 때에는 어마어마하게 느리다는 단점이 있다. 대신 본인 입장에서는 시간을 낭비하는 것이 아니므로 행동을 이어가는 장점이 있다. C#에서는 이벤트를 구현할 때에는 두 가지 방법이 있다. 1. Auto Reset Event 이는 톨케이트를 생각하면 된다. 톨게이트를 보면 차가 한대한대씩 지나가고, 지나갈 때마다 톨게이트가 닫혀 대기해야 하는 상황이 발생하는데 이것이 바로 Auto Reset Event의..

Part 4-2-11. 멀티쓰레드 프로그래밍 : 문맥 교환(Context Switching)

멀티 쓰레드 문맥 교환 (=컨텍스트 스위칭(Context Switching)) 우리는 이전 시간에 아래와 같은 코드에서 while문을 이용해 반복적으로 실행되는 것을 스핀락이라고 학습하였다. 그렇지만 문맥 교환 방법(PPT 예시 - 랜덤 메타 방식)으로 이를 구현하려고 하면 어떻게 해야할까? 방법은 간단하다. 아래 소스코드에서 일정 시간을 쉬다가 오면 이것이 문맥 교환 방법이 되는 것이다. public void Acquire() { while (true) { int expected = 0; int desired = 1; if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected) break; } } 쉬는 방법에는 총 세 가지의 ..

반응형