본문 바로가기

전체 글

(64)
중복 없는 수열 만드는 알고리즘 ( C++로 만드는 숫자 야구 게임 ) 이번 글은 지난번 숫자 야구 게임 만들기에서 이야기했던 중복 없는 수열 만드는 알고리즘입니다. 2021.03.29 - [Program Language and Algorithm] - C++로 만드는 숫자 야구 게임 : 문제를 내는 알고리즘 C++로 만드는 숫자 야구 게임 : 문제를 내는 알고리즘 숫자 야구 게임은 소프트웨어 엔지니어링에 대해 배우다 보면 한 번씩은 보게 되고, 또 만들게 되는 간단한 숫자 게임입니다. 문제를 내는 알고리듬은 반복문이나 조건문, 입출력 등의 기본 기 sbinroom.tistory.com 2021.03.30 - [Program Language and Algorithm] - C++로 만드는 숫자 야구 게임 : 문제를 푸는 알고리듬 C++로 만드는 숫자 야구 게임 : 문제를 푸는 ..
C++로 만드는 숫자 야구 게임 : 문제를 푸는 알고리듬 이전 글에서는 초록이(문제를 내는 알고리듬)를 만들었으니 이번엔 파랑이를 만들어 주려고 합니다. 2021.03.29 - [Program Language and Algorithm] - C++로 만드는 숫자 야구 게임 : 문제를 내는 알고리즘 C++로 만드는 숫자 야구 게임 : 문제를 내는 알고리즘 숫자 야구 게임은 소프트웨어 엔지니어링에 대해 배우다 보면 한 번씩은 보게 되고, 또 만들게 되는 간단한 숫자 게임입니다. 문제를 내는 알고리듬은 반복문이나 조건문, 입출력 등의 기본 기 sbinroom.tistory.com 초록이는 간단했지만 파랑이는 조금 복잡합니다. 쉽게 만들면 쉽고 어렵게 만들면 어렵죠. 일단 가장 간단한 방법으로 만들어 보았습니다. 초록이는 문제를 내고, 검사 하고, 통보하는 게임의 심판..
C++로 만드는 숫자 야구 게임 : 문제를 내는 알고리즘 숫자 야구 게임은 소프트웨어 엔지니어링에 대해 배우다 보면 한 번씩은 보게 되고, 또 만들게 되는 간단한 숫자 게임입니다. 문제를 내는 알고리듬은 반복문이나 조건문, 입출력 등의 기본 기술에 대한 평가 방식으로도 이용됩니다. 문제를 푸는 알고리듬은 내는 알고리듬보다 조금 어려운 정도입니다. 굳이 하고 싶다면 여러 가지 기술을 사용해서 조금 더 똑똑한 알고리즘을 만들 수도 있습니다. 이 글은 숫자 야구 게임을 주제로 하는 글의 시작으로 여기선 내는 쪽을 다루려고 합니다. 그 후에 푸는 알고리듬을 다룬 뒤, 마지막으로 프로세스 간 통신 기술 인 인터 커뮤니케이션을 다뤄볼까 합니다. 그럼 숫자 야구 게임의 개념부터 설명하죠. 아래 그림을 참조해 주세요. 설명을 도와줄 초록이와 파랑이입니다. 숫자 야구 게임 숫..
Call by Value and Call By Reference 메모리 직접 접근이 가능한 소프트웨어 언어의 함수 호출 방법은 두 가지입니다. 하나는 call by value이고, 하나는 call by reference입니다. 자세한 개념은 전공서적이나 위키피디아를 통해서 습득하시는 것으로 하고, 이 글에는 간단한 설명과 예제가 따라옵니다. call by value는 입력 아귀먼트를 복사하는 함수입니다. 입력 아귀 먼트와 같은 데이터형의 지역 변수를 만들고, 값을 복사합니다. call by reference는 입력 아귀먼트의 주소 값을 참조합니다. 따라서 호출된 함수에서 아귀 먼트의 값을 변경하면, 호출 한 함수에서도 변경됩니다. 포인터를 전송하는 것과 같죠. 그럼 설명은 요렇게 간단하게 마치고, 예제로 넘어 가겠습니다. #include #include using n..
메모이제이션 : 중복 연산 해결 (러시안 페인트공 알고리듬) 이 포스팅에서는 메모이제이션을 논하려고 합니다. 메모이제이션은 중복되는 연산의 결과를 저장하여, 연산 횟수를 줄이는 소프트웨어 엔지니어링 기술입니다. 소프트웨어 개발 중에는 항상 하게 되는 선택이 cpu를 사용하는가 메모리를 사용하는가입니다. 이 기술은 컴퓨팅 리소스 중 cpu의 사용량을 줄이는 대신 메모리의 사용량을 늘려줍니다. 메모이제이션을 잘 사용하면 다양한 알고리듬을 가속화할 수 있는 아주 중요한 기술입니다. 긴 글과 개념적인 설명은 여기서 마치겠습니다. 자세한 설명을 원하시면... 전공서적이나 위키피디아를 참고하세요. 여기선 간단한 예제로 설명하겠습니다. 사용하는 예제는 피보나치수열입니다. 피보나치 수열의 알고리듬 구조상 설계는 자연스럽게 재귀 호출이 되고, 메모이제이션을 이용하면 구동 시간을 ..
러시안 페인트공 알고리듬 오래전 조엘 스폴스키 의 책을 보면서 여러 가지를 배웠습니다. 그중 하나가 러시안 페인트공 알고리듬이었습니다. 지금은 아마도 누군가에게 책을 빌려 준거 같고, 개요만 머릿속에 남아 있습니다. 기억을 더듬어 알고리듬을 설명하고, 해결 방법과 함께 짧은 포스팅을 하려고 합니다. 러시안 페인트공 알고리듬(정확한 내용이 필요하시면 책을 보시거나, 조엘의 블로그를 보거나, 다른 분들의 포스팅을 보세요. ) 어떤 건설 업자가 도로를 만들었습니다. 긴 도로가 완성되고, 이제 남은 일은 도로에 차선을 그리는 일입니다. 마침 도로의 시작위치에 러시안 페인트공이 운영하는 페인트 가게가 있습니다. 업자는 러시안 페인트공에게 차선을 그리는 일을 맡겼습니다. 첫째날 러시안 페인트공은 300미터의 차선을 그립니다. 업자는 결과에..
C++를 이용한 피보나치 수열 구현 (fibonacci) 이 포스트의 목적은 가끔 예제로 이용하는 피보나치 수열을 구현하는 방법에 대한 포스트입니다. 만들어 보니 7가지가 나왔으며, 버전에 따라 재귀 호출, 메모리제이션 등을 이용해 최적화하는 방식으로 구현됩니다. 먼저 피보나치수열을 알아봐야죠. 피보나치수열은 아래 규칙을 따르는 수열입니다. $$f_0 = 0$$ $$f_1 = 1$$ $$f_n = f_{n-1} + f_{n-2} \quad ( n \in\left \{2,3,4,\cdots\right\} )$$ 구조는 단순하지만 구현 시 오버플로우와 중복 연산에 주의해야 합니다. 그럼 먼저 간단히 구현해 보겠습니다. 별다른 소프트웨어 공학의 기술이 들어 가진 않지만 설계 시엔 약간 두통을 유발합니다. #include #include using namespace ..
OpenMP 병렬 처리 : 스케줄링 병렬 처리에서 가장 중요한 변수 중 하나인 스케줄링입니다. 스케줄링은 병렬화 한 구문을 어떤 스레드에게 어떻게 분배할지 결정하는 것입니다. 만약 이걸 std::thread와 같은 스레드에 구현해서 쓰려고 하면 아주 골치 아파집니다. 자세히 알고 싶으시면 즐거운 운영체제 강의를 열심들 들어 봅시다~ 유후~(졸업해서 다행이다..) OpenMP는 골치 아픈 스케줄링을 간편하게 구현해 줍니다. 쉽게 3가지 대표적인 스케줄링 기법이 있고, 사용자가 원한다면 만들어 사용할 수 있습니다. OpenMP의 스케줄링 스케줄링에 들어가기에 앞서 이용되는 변수인 chunk에 대해 알아보죠. OpenMP에서 chunk는 스레드에게 분배하는 task의 최저 크기입니다. 만약 task의 총 개수가 11개 이고, chunk가 1이라..