숏코딩 분석

프로그래머스> [Level1] 두정수 사이의 합 문제를 작성 후

다른 사람은 어떻게 풀었는지 궁금해져서 다른 사람들의 풀이를 확인 하는 곳으로 이동하여, 가장 처음의 풀이의 조건처리 하는 부분을 보았더니 단 2줄.. 처음엔 이게 뭔가..

  1. 뚫어지게 보고,
  2. 비트연산 해보고,
  3. 팀장 아저씨한테 물어보고,
  4. 숏코딩 코드를 분리해 본 후.

숏코딩이 뭔지 찾아보니.. 가독성과 효율은 다 필요없고, 그냥 짧은 타이핑(…)을 목적으로 하고 있었네요. 덕분에 흥미가 자극되어져서 재밋게 문제를 풀어 보았습니다.

  • 문제 설명
    • 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
  • 제한 조건
    • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
    • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
    • a와 b의 대소관계는 정해져있지 않습니다.
#include vector

using namespace std;

long long solution(int a, int b)
{
    long long answer = 0;
    if (a > b) a ^= b ^= a ^= b;
    answer = (long long)b * -~b / 2 - (long long)a * ~-a / 2;
    return answer;
}

계속 읽기 “숏코딩 분석”

[Level1] 연속된 같은 숫자 제거

프로그래머스> [Level1] 같은 숫자는 싫어

#include vector

using namespace std;

vector solution(vector arr)
{
    vector answer;

    int prev = arr[0];
    answer.push_back(arr[0]);

    for (int i = 1; i  제네릭 unique 알고리즘을 이용 중복값 제거"]
#include vector
#include algorithm
#include iostream
#include iterator

using namespace std;

vector solution(vector arr)
{
    vector answer = arr;

    // 문제가 쏘팅 안해도 되는거네.
    //sort(answer.begin(), answer.end());

    // 중복 제거.
    vector::iterator newIntVector;
    newIntVector = unique(answer.begin(), answer.end());

    // 끝부분을 제거.
    answer.erase(newIntVector, answer.end());

    return answer;
}

Git 원격저장소에 Push 후 GitLab CI Runner 를 통한 빌드 자동화

“Git 원격 레포지토리 설정 및 SourceTree 를 사용하여 UE4 프로젝트 Push” 포스팅 에서 사용한 샘플 프로젝트 – Example.7z 안 의 .gitlab-ci.yml 은 GitLab CI 의설정 파일이고, 열어보면 설정된 러너태그인 “windowbuildpc” 일 때만 GitLab CI Pipeline의 Job이 실행 되도록 설정이 되어 있다.

다음목표

  1. GitLab 공식 사이트에서 CI 설정 하는 방법 추가.
    1. 공식 사이트의 GitLab CI 샘플 원격 레포지토리 링크
  2. CI 설정을 원하는 테스트 및 자동화된 배포 환경을 구성.
  3. .gitlab-ci.yml 설정법에 대한 깊은 이해.

GitLab Runner 설정 및 CI 설정 법

계속 읽기 “Git 원격저장소에 Push 후 GitLab CI Runner 를 통한 빌드 자동화”

Git 원격 레포지토리 설정 및 SourceTree 를 사용하여 UE4 프로젝트 Push

git을 사용할때 대표적이고 편한 툴로 ‘SourceTree’ 를 꼽을 수 있으니, 깃 클라이언트 툴은 정했고 이걸 이용해서 원격 레포지토리에 연동을 해놓은 뒤 기존에 만들어 놓은 언리얼 프로젝트를 Push 하는 방식으로 진행.

다음목표

  1. Git 원격저장소에 Push 후 GitLab CI pipeline 을 통한 빌드 자동화 – 완료

원격 레포지토리의 설정 및 프로젝트의 Push 가이드

  • 언리얼샘플프로젝트(4.19.2) 파일 링크 : Example.7z

계속 읽기 “Git 원격 레포지토리 설정 및 SourceTree 를 사용하여 UE4 프로젝트 Push”

Synology 에 GitLab 설치 및 프로젝트(UE4)용 원격 레포지토리 생성

시놀로지에서 지원하는 애플리케이션의 설치는 정말 직관적이고 쉽게 되어있어서 좋다. 결국 설치되어 있는것들의 설정에 대한 변경 및 수정은 리눅스와 마찬가지로 터미널에서 해야하지만. 정말 편하게 잘 되어있는것은 너무나 감사한일이다.

다음목표

  1. Git 원격 레포지토리 설정 및 SourceTree 를 사용하여 UE4 프로젝트 Push – 완료

 

GitLab 설치와 원격 레포지토리 생성 및 설정 가이드

계속 읽기 “Synology 에 GitLab 설치 및 프로젝트(UE4)용 원격 레포지토리 생성”

WMWare 로 논리 하드디스크(이미지 생성) 추가

VMWare 에서는 디스크에 논리적으로 이미지를 생성해서 사용하는 방식과 물리적인 하드디스크를 바로 인식해서 사용 하는 방식이 있고 지금은 이미지를 생성해서 사용 하는 방식으로 설정할 예정.

가상머신의 논리 디스크 이미지 생성 가이드

계속 읽기 “WMWare 로 논리 하드디스크(이미지 생성) 추가”

vmware 에 헤놀로지 (synology) 및 DSM 설치

근래에 바쁜 일들이 어느정도 마무리 되어 관심 있는것들과 해왔던것들에 대해 정리 하는 시간을 가질 예정중에 가상머신으로 시놀로지를 설치해서 깃랩 CI 를 사용해 자동화를 구성 해보고 싶어져서 이렇게 정리를 시작 합니다. 깃랩 CI 에 대해 알려준 동료 직원에게 감사를 전하고 싶습니다.

다음목표

  1. WMWare 로 논리 하드디스크(이미지 생성) 추가 – 완료
  2. Synology 에 하드디스크 볼륨 생성 – 완료
  3. Synology에 GitLab 설치 및 프로젝트(UE4)용 원격 레포지토리 생성 – 완료
  4. Git 원격 레포지토리 설정 및 SourceTree 를 사용하여 UE4 프로젝트 Push – 완료
  5. Git 원격저장소에 Push 후 GitLab CI Runner 를 통한 빌드 자동화 – 완료
  6. Docker를 이용한 무언가를 해보기.?

vmware 에 synology 설치 하기 전에..

컴터맨 님께서 작성해 주신 헤놀로지 설치 가이드를 보고 설치를 진행 하였습니다. 매우 쉽게 설치 방법이 설명되어 있어 설치에 많은 도움이 되었습니다. 컴터맨 님께 감사의 말씀을 전하고 싶습니다.

– 출처 : NAS 기본 설치 과정. 헤놀로지 부팅 USB 만들고 DSM 기본 설치 하기

먼저 시놀로지를 PC에 설치 할 수 있도록 배포하고 있는 XPEnology(헤놀로지)의 설치 라이센스 관련 내용을 알고 계시면 좋을 듯 합니다. 시놀로지 디바이스 외의 설치는 불법 이라고 합니다. 공식적으로 활동 하고 있는 커뮤니티나 사용자들에게는 특별히 제재(위협)을 가하는 등의 일은 없을것이라고 합니다.

– 관련내용 출처 : XPEnology 불법인가? 아닌가?

VMWare 설정 및 DSM 설치 가이드

19번째 스크린샷 상태의 DiskStationManager 설치가 완료되고, 부팅이 된 이후 검은화면에서 더이상 넘어가지 않는 상황이 발생 합니다. 이유는 VMWare 에서 최초에 CDROM 으로 설치된 이후 에는 무조건 CDROM 으로 부팅을 하지 않기 때문입니다. 그 것을 해결하기 위해서 가상머신 설정파일인 .vmx 파일에 bios.bootOrder = “cdrom” 항목을 추가해 주면 매번 cdrom 으로 부팅을 하게 됩니다.

– 출처 : [입문] VMware Player를 이용해서 XPEnology/Synology 간단히 구축하기~

계속 읽기 “vmware 에 헤놀로지 (synology) 및 DSM 설치”

[Level1] 2016년 a월 b일에 해당하는 요일 구하기

실제 문제를 풀어보고, 다른사람과 비교하는 재미가 꽤 있다. 시간날때 하나씩 풀어보면 좋을듯 함.

프로그래머스> [Level1] 2016년

#include vector
#include string

using namespace std;

string solution(int a, int b)
{
    string answer = "";

    int year = 2016;
    int month = a;
    int day = b;

    // 날짜의 시작은 월요일이고, 가정된상황이 2016년 1월 1일은 금요일
    // 이기 때문에, 추가적으로 금요일(월[0]부터시작 화[1],수[2],목[3],금[4])
    // 만큼의 Day를 더해 주어야 함.
    int additionalDay = 4;

    // 전제 조건이 윤년이므로, 윤년을 체크하는 로직은 필요 없고,
    // 바로 윤년일때의 데이타를 사용하면 됨.
    int DayArr[13] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int MonthTotalDay = 0;
    for (int i = 0; i < month; i++)
    {
        MonthTotalDay += DayArr[i];
    }

    // 1월1일에서 설정된 월, 일에 맞추어 합산된 Day에 따른
    // VIP(DayOfTheWeek의 약어)를 설정해서 보내준다.
    int DayOfTheWeek = (MonthTotalDay + day + additionalDay) % 7;

    switch (DayOfTheWeek)
    {
        case 0: answer = "SUN"; break;
        case 1: answer = "MON"; break;
        case 2: answer = "TUE"; break;
        case 3: answer = "WED"; break;
        case 4: answer = "THU"; break;
        case 5: answer = "FRI"; break;
        case 6: answer = "SAT"; break;
    }

    return answer;
}

 

  • 윤년 계산법
    • 윤년(4년에 한번)일때는 1일을 더해준다.
    • 윤년 계산에 대한 오차를 보정하기 위해 100년마다 하루를 뺀다.
    • 두번의 오차 수정에도 불구 하고 오류가 정확히 보정되지 않기 때문에 400년 마다 하루를 더해준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Level01_2016 : MonoBehaviour
{
	void Start ()
    {
        // 01. 1년 부터 (Y-1)년 까지 윤년(LeapingYear)의 수를 구한다.
        int Y = 2016;
        int L = ((Y - 1) / 4) - ((Y - 1) / 100) + ((Y - 1) / 400);
        Debug.Log("1 To 2016 Year LeapingYearCount : " + L);

        Debug.Log("[Func] 1 To 2016 Year LeapingYearCount : " + GetLeapingYear(2016));

        // -- 여기서부터 실제 계산.
        // 2016년 1월 1일은 금요일 이기때문에 추가적으로 금요일(월[0]부터시작 화[1],수[2],목[3],금[4]) 만큼의 Day를 더해 주어야 함.

        int year  = 2016;
        int month = 6;
        int day   = 21;

        Debug.Log(year + ". " + month + ". " + day + " What the VIP");

        Debug.Log("[Func] " + year + " is LeapingYear : " + GetIsLeapingYear(year));

        int TotalMonthDay = GetTotalDayByMonth(month, GetIsLeapingYear(year)) + day + 4;
        string VIP = GetDayOfWeekToString(TotalMonthDay % 7);

        Debug.Log("[Func] VIP : " + VIP);
    }

	// Update is called once per frame
	void Update () {

	}

    string GetDayOfWeekToString(int DayOfTheWeek)
    {
        string DayOfTheWeek_Str = string.Empty;

        switch(DayOfTheWeek)
        {
            case 0: DayOfTheWeek_Str = "SUN"; break;
            case 1: DayOfTheWeek_Str = "MON"; break;
            case 2: DayOfTheWeek_Str = "TUE"; break;
            case 3: DayOfTheWeek_Str = "WED"; break;
            case 4: DayOfTheWeek_Str = "THU"; break;
            case 5: DayOfTheWeek_Str = "FRI"; break;
            case 6: DayOfTheWeek_Str = "SAT"; break;
        }

        return DayOfTheWeek_Str;
    }

    // 01. 1년 부터 TargetYear년 까지의 윤년의 수를 구한다.
    int GetLeapingYear(int TargetYear, int FromYear = 1)
    {
        int LeapingYear = 0;

        /**
         * 태양력에 대한 날짜보정(윤년 계산).
         * 1차. 4년마다 하루를 더해준다.
         * 2차. 1차에서의 계산에 오차가 있어, 100년 마다 하루 뺌.
         * 3차. 2차에서의 보정에 대해서도 오차가 있어 400년 마다 하루를 더함.
         */
        LeapingYear = ((TargetYear - FromYear) / 4) - ((TargetYear - FromYear) / 100) + ((TargetYear - FromYear) / 400);

        return LeapingYear;
    }

    bool GetIsLeapingYear(int TargetYear)
    {
        bool IsLeapingYear = false;

        if ((TargetYear % 4)  " + TotalYearPerDay);
        return TotalYearPerDay;
    }

}

[C#] IEnumerable, Linq 사용 예제

유니티에서 Foreach 를 실행시 Garbage를 생성시키는것을 피하기위해서 주로 사용 했었는데, 근래에는 Foreach를 사용해도 Garbage를 생성 하지 않는다 한다.

다음목표

  1. IEnumerable 를 어떤 케이스에서 쓰는게 효율적일지 생각해보자.
  2. Linq 는 어떤 상황일때 쓰는게 좋을지 생각해보자.
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // IEnumerable 쓰려고.
using System.Linq;

public class Bong9_Enumerable : MonoBehaviour {

	// Use this for initialization
	void Start () {

        ///
        /// string 객체에는 IEnumerable 인터페이스가 구현 되어있다.
        /// 

        string[] strList = { "bong9", "bong8", "bong7", "b09", "b08", "b07" };

        // 구현.
        Debug.Log("------IEnumerable() Start ------");
        IEnumerable(strList);
        Debug.Log("------IEnumerable() End ------");

        // Linq 사용.
        Debug.Log("------IEnumerable_Linq() Start ------");
        IEnumerable_Linq(strList);
        Debug.Log("------IEnumerable_Linq() End ------");
	}

    void IEnumerable_Linq(string[] strList)
    {
        // 조건 : 글자수가 3개 이하.
        IEnumerable enumerable = from str in strList where str.Length <= 3 select str;

        IEnumerator e = enumerable.GetEnumerator();

        while (e.MoveNext())
        {
            Debug.Log(e.Current);
        }
    }

    void IEnumerable(string[] strList)
    {
        IEnumerator e = strList.GetEnumerator();

        while (e.MoveNext())
        {
            Debug.Log(e.Current);
        }
        // Debug.Log(e.Current); // 이미 열거가 완료되어 에러.

        e.Reset(); // 열거 초기화.
        e.MoveNext();
        Debug.Log(e.Current + "열거 초기화 후 다시 출력.");
    }

	// Update is called once per frame
	void Update () {

	}
}