posted by REDFORCE 2017. 12. 5. 15:52

최근 여러 곳에 이력서를 넣으면서 프로그래머스를 이용한 온라인 코딩테스트를 제출하는 곳이 여럿 보이길래, 한번 프로그래머스에 나오는 알고리즘 연습 문제들을 풀어보기 시작했습니다.


----------------------------------------------------------


프로그래머스 Level 1.피보나치 수


문제 ----------------------------------------------------------

피보나치 수는 F(0) = 0, F(1) = 1일 때, 2 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 점화식입니다. 2 이상의 n이 입력되었을 때, fibonacci 함수를 제작하여 n번째 피보나치 수를 반환해 주세요. 예를 들어 n = 3이라면 2를 반환해주면 됩니다.

----------------------------------------------------------



재귀함수를 사용하여 간단하게 구할 수 있는 방법이 있지만

시간복잡도가 기하급수적으로 증가하므로


다음과 같이 이전 계산을 기억해두어 계산하는 방법이 있다.




posted by REDFORCE 2017. 10. 9. 22:02

간혹 프로그래밍 기본 문제로 최대공약수와 최소공배수를 구하는 문제가 나옵니다.


이번 글에서는 위 문제에 대한 다양한 해결 방법이 존재하겠지만

유클리드 호제법을 이용하여 해결하는 방법을 적어두겠습니다.



A. 최대공약수


유클리드 호제법은 두 수를 입력받았을 때,


1. 큰 수에서 작은 수를 나눈 나머지를 구한다.

2. (1)에서의 과정에 작은 수를 다시 한번 큰수로 입력, 나머지를 작은 수로 입력하여 (1)의 과정을 계속 반복한다.


3. 나머지가 0이 되면 (2)까지의 과정을 종료한다.

4. 마지막으로 나눈 값이 최대공약수이다.



B. 최소공배수


최소 공배수를 구하는 방법은 위에서 구한 최대 공약수로 처음의 큰 수와 작은 수의 곱을 나누면 된다.


식 : 큰 수 * 작은 수 / 최대 공약수




posted by REDFORCE 2017. 9. 15. 16:38

바이트에서 1인 비트의 갯수를 새는 방법은 여러가지가 있으나

본 글에서 적는 방법은 MSDN에서 제시하는 방법을 기술하고자 합니다.


간단히 비트 플래그 갯수를 새는 방법은 다음과 같은 코드로 수행할 수 있습니다.


WORD GetNumberOfBits( DWORD dwMask )
{
    WORD wBits = 0;
    while( dwMask )
    {
        dwMask = dwMask & ( dwMask - 1 ); 
        wBits++;
    }
    return wBits;
}

위 코드는 MSDN에 적혀있는 코드입니다.


API 형식의 자료형으로 적혀있어서 기본 C++ 형태로 바꾼 코드는 다음과 같습니다.




가볍게 MSDN 코드를 바꾸어 테스트 코드와 비트 갯수를 세는 코드만 적어두었습니다.



posted by REDFORCE 2017. 9. 5. 17:19

흔히들 대학과제로든 시험으로든 면접에서든

C++과 Java의 차이점에 대해서 기술해보라는 문제가 자주 등장한다.


최근 김포프님의 포프tv를 보면서 C++이 Java보다 어떤 점들이 다른지에 대해서

이야기를 들은 적이 있었는데, 궁금해서 구글에 뒤져보다보니


위키에 비교가 잘 정리되어 있어서 블로그에 옮겨적게 되었다.



1. 두 언어는 일단 설계 목표부터가 다르다.


 - 역사적으로 C++은 C를 확장하여 파생 된 언어이다. 절차적 프로그래밍 언어에 효율적인 실행을 목표로 설계 되었고, 정적 자료형 검사, 객체 지향 프로그래밍, 예외처리, RAII, 제너릭 프로그래밍을 지원한다. 범용 컨테이너와 알고리즘을 포함한 C++ 표준 라이브러리가 추가 되어있다.


 - JAVA는 임베디드 제품(가전 제품 등)에 탑재 되어 네트워크 컴퓨팅을 지원하기 위해서 만들어졌다. 항시 Java는 가상 머신 위에서 실행 된다는 특징이 있으며 안전성과 이식성이 높은 것이 장점이다. 하위 플랫폼을 완벽히 추가시켜주는 광대한 분량의 라이브러리를 가지고 있고, JAVA는 C와 비슷한 문법을 사용하나 직접적인 호환성은 없다.



2. 비교 표


 C++

JAVA 

 C 소스 코드와 하위 호환성

다른 언어와 소스 코드 호환성은 없음 

직접적인 시스템 라이브러리 호출 가능 

자바 네이티브 인터페이스를 이용 

저수준 시스템 접근 가능 

안전하게 보호되는 가상 머신 위에서 실행 

선택적 자동 경계 검사 

항상 자동 경계 검사함 

부호없는(unsigned) 연산 지원

부호 없는 연산 지원 안함 

값에 의한 매개변수 전달 또는 참조에 의한 매개변수 전달 

항상 값에 의한 매개변수 전달. 매게변수로 객체에 대한 참조값을 사용할 수는 있다. 참조 대상의 내용을 변경할 수는 있지만 참조값 자체는 변경할 수 없다. 메서드 호출 후에도 참조하는 객체는 다른 객체로 바뀌지 않을 것이다.

명시적 메모리 관리, 가비지 컬렉션은 추가적으로 라이브러리를 이용해야 함 

항상 자동 가비지 컬렉션 

명시적인 자료형 재정의 허용 

자료형 안정성에 엄격함 

C++ 표준 라이브러리는 적절한 범위까지 지원함

광대한 분량의 라이브러리 

연산자 오버로딩 

연산자 재정의 할 수 없음 



그 외에도 방대한 내용을 적을 수 있을 정도로 차이가 있으나...

기본적으로는 위 사항 정도만 숙지하고 있어도 어느정도 큰 차이점들은 알 수 있을 것으로 생각한다.


더 자세한 차이 점에 대해서는 아래 위키에서 참조!!


위키백과 - 자바와 C++의 비교

posted by REDFORCE 2017. 9. 4. 15:54

이번 글에서는 Shift 연산을 이용한 방법에 대해서 적도록 하겠습니다.


보통 CPU에서 나눗셈 연산 ( ' / ' )을 사용하는 것은 속도가 엄청 느린 연산입니다.

(컴퓨터는 덧셈밖에 모르는 바보라서...)





따라서, 나눗셈 작업을 많이 호출 하는 경우 그 만큼 소모되는 시간적 자원이 가장 많다는 뜻이기도 합니다.


어쩔수 없는 경우는 나눗셈을 사용하는 것이 지당하지만, 가능한 경우라면 Shift 연산을 이용하는 방법도 있습니다.


예) 3451을 100으로 나눈 몫을 구할 때

몫 : 34

나머지 :51 


이라는 점을 누구나 쉽게 바로 암산할 수 있습니다.


여기서 100으로 나누는 경우 일/십의 자리수는 무시하고 앞의 두자리 3400을 간단히 100으로 나눠버린 값으로 몫이 나올 거라는 것을 추론할 수 있을 텐데요.


이진수에서도 마찬가지로 간단히 뒷자리는 무시하고 앞자리만 계산을 하면 되는데요.

예를 들어서 1101 1100 을 1000 으로 나눈 몫은

뒤 3자리를 무시하고 나온 11011 이 됩니다.


이 방법을 잘 살펴보면, 위와 같이 1000 으로 나누는 경우

원래 수에서 오른쪽으로 3칸 Shift를 해버리면 11011이 나온 다는 것을 알 수 있습니다.


아래 사진은 Shift 연산을 이용한 예제 입니다.



posted by REDFORCE 2017. 8. 30. 15:33

Sephy Engine과 Sephy Engine 을 기반으로 한 전략게임을 제작한 문서 정리가 끝났습니다.


아직 미흡하고 부족한 부분이 많은 엔진이고 버그 투성이인 게임이지만


어떻게 마무리를 짓고 이렇게 끝낼 수 있게 되었네요.


함께 개발에 참여해주셨던 성윤님과 최윤님 그리고 고생많이 하신 학성님께 감사드립니다.


Sephy Engine Development Document.pdf




posted by REDFORCE 2017. 8. 30. 15:33



Sephy Engine으로 제작한 게임의 Battle 소개 영상입니다.


목표로 했던 모든 콘텐츠를 완전히 다 구현하진 못하고 마무리 하게 되었으나

여기까지 그래서 만들어왔다는 점이 돌아보면 많이 한거 같기도 하고...별로 한게 없는거 같기도하고...


버그 투성이에 부족한 기능이 많은 게임이지만 어찌어찌 여기까지 왔네요 :)

posted by REDFORCE 2017. 8. 30. 15:30


Sephy Engine으로 제작한 게임의 Simple 전투 수행 영상입니다.


별다른 설명은 필요없을 것 같아 내용은 적지 않겠습니다.

posted by REDFORCE 2017. 8. 30. 15:28


Sephy Engine으로 제작한 맵 툴(MapTool) 입니다.


Engine에서 제공해주는 UI 프레임워크를 사용하여 제작하였습니다.

제작하고있는 게임에 맞춰서 제작한 맵툴 이기 때문에 다소 특이한 기능들이 몇가지 첨부 되어 있습니다.


기본적으로 Isometric 을 기반으로한 타일 방식을 사용하고 있으며,

일반 타일, 오브젝트, 이벤트 오브젝트로 분류하여 오브젝트들을 설치할 수 있습니다.


맵툴은 추후에 어떤 데이터가 생길 것인가 하는 문제 때문에 설계기간이 길어져서 프로그래밍 작업 기간은 짧으나 실제 제작기간은 상당히 오래걸렸습니다.

posted by REDFORCE 2017. 8. 30. 15:09


Sephy Engine (자체 엔진)으로 제작한 게임에서 사용했던 Unit Testing Tool 입니다.



게임에서 사용하고자 하는 함선의 데이터를 불러와서 모의전투가 수행가능하며

밸런스 조절을 목적으로 유닛들의 성능들을 바꿔가며 실시간 테스팅이 가능하도록 만들었습니다.


중간 중간 유닛을 새로 생성하거나 삭제가 가능한구조로 되어있으며,

아군 vs 적군 유닛으로 구분하여 모의 전투 수행이 가능합니다.


자체엔진에서 이것저것 UI까지 정리해서 만드는데 3일정도 걸렸던 것 같네요.