숏코딩 분석

프로그래머스> [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;
}

[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;
    }

}