TIL 0112 TIL 0112 TextRPG (팀) - 6 / 여러 가지 공부

강성원·2024년 1월 16일
0

TIL 오늘 배운 것

목록 보기
17/70

오늘 팀 활동

오늘은 내일 발표 전 팀장님의 발표의 내부 리허설을 진행했고, 내용을 더 걷어낼 것이 없는지 살펴보는 시간을 가졌다.

진짜 기대 하나도 안하고 그저 감사한 마음만 가지고 있었는데 영상 내용도 정말 알찼고, 준비하신 스크립트의 내용도 고민을 많이 하신 흔적이 느껴졌다.

팀장님의 캐리력을 목도할 수 있었다.

걷어낼 부분을 눈에 불을 켜고 찾아봤지만 내용이 너무 알차버린 바람에 많은 의견을 내지는 못했다..

최고다..최고..

이 외의 시간에는 우리 팀의 경우 어제까지 코딩을 끝냈기 때문에 오늘은 전에 미루었던 부분들에 대해서 공부하는 하루를 가졌다.


오늘 공부한 내용

두 정수 사이의 합

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

이 문제는 오늘 코드카타 시간에 푼 문제 중 하나이다.
처음 풀땐 swap과 for문으로 차례대로 수를 더해서 쉽게 풀었지만 등차수열의 합으로 더 짧고 좋은 코드를 만들 수 있어서 기록해본다.

using System;

public class Solution {
    public long solution(int a, int b) {
        
        if(a == b) return a;
        
        return ((long)(Math.Abs(a - b)+1) * (b + a)) / 2;
    }
}
  • a가 4이고 b가 6이라고 하면 이 그림처럼 나타낼 수 있다.
    4+5+6=(310)/24 + 5 + 6 = (3 * 10) / 2 이다.
    (abs(ba)+1)(b+a)/2(abs(b-a)+1)*(b+a)/2 등차수열의 합 공식으로 간단히 나타낼 수 있다.

수포자에겐 이런 것도 새롭다. 수학도 틈틈히 꾸준히 해야겠다.


피보나치 수열 - 메모이제이션 동적 계획법

피보나치수열을 단순히 재귀함수의 호출로만 구현하면 구하려는 수가 커질 수록 함수의 호출 수가 기하급수적으로 많아진다.
이런 현상을 방지하기 위한 것이 메모이제이션 동적 계획법이다.

피보나치 수열 - 2 (메모이제이션 동적계획법) 정리글


숫자형태 문자열 => 숫자

알고리즘 문제 "문자열을 정수로 바꾸기"에서 int.Parse()만 이용해서 한 줄로 문제를 간단히 풀었었다.

숫자 형태의 문자열을 숫자로 바꾸는 함수를 구현해보고싶어서 구현해봤다.

양의 정수 형태 문자열만 받기

int StringToInt(char strNum[])
{
    int answer = 0;

    for (int i=0; i<strlen(strNum); ++i)
    {
        answer = answer * 10 + (int)(strNum[i]-48);
    }
    return answer;
}

int main()
{
    char strNum[] = "10304";
    StringToInt(strNum);
}
  • 아스키 코드표에서 정수형 문자 "0"~"9"는 48~57번째이다.
    만약 문자 "0"을 int로 캐스팅한다면 48의 정수를 만날 것이다.
    그래서 먼저 48을 빼준 후에 int로 캐스팅하면 원하는 정수 값을 받아낼 수 있다.

  • int로 캐스팅한 값을 answer에 10씩 곱하며 누적시킨다.

양,음의 정수 형태 둘 다 받기

음의 정수도 받도록 만들어봤다.

int StringToInt(char strNum[])
{
    int answer = 0;
    int i = 0;

    bool isMinus = strNum[0] ==  '-' ? true : false;

    if (isMinus) ++i;

    for (; i<strlen(strNum); ++i)
    {
        answer = answer * 10 + (int)(strNum[i]-48);
    }

    if (isMinus) answer *= -1;

    return answer;
}

약간의 하드코딩 느낌이 난다. ㅎㅎ

  • 문자 배열의 맨 첫 번째 요소가 "-"라면 isMinus에 true를 쥐어주고 i값을 1로 증가시켜준다.

  • i 값에 따라서 문자 배열의 요소를 숫자로 변경시켜 10씩 곱하며 누적한다.

  • 반환 전에 isMinus 값에 따라 음,양을 결정해준다.

static int StrToInt(string strNum)
{
    int answer = 0;
    int i = 0;

    bool isMinus = strNum[0] == '-' ? true : false;

    if (isMinus) ++i;

    for (; i < strNum.Length; ++i)
    {
        answer = answer * 10 + (int)(strNum[i] - 48);
    }

    if (isMinus) answer *= -1;

    return answer;
}

static void Main(string[] args)
{
    Console.WriteLine(StrToInt("-13579"));
}

C#은 이런 느낌이다. 세세한 것 말고는 변함 없다.


델리게이트 (delegate) 정리

델리게이트가 좀 헷갈려서 오늘 깊숙히 파보는 시간을 가졌다.

델리게이트 (delegate) 정리글

우선 델리게이트가 무엇인지, 그리고 콜백 매커니즘에 델리게이트가 어떻게 이용되는지 써놓았다.
이 외에도 이벤트 처리나 비동기처리, 여러 메서드를 할당할 수 있는 델리게이트 체인이 있지만 시간 상 2편, 3편으로 더 써볼 생각이다.

개념이 헷갈렸지만 또 깊게 파서 내 글로 만들고 보니 꽤 쓸만하고 그렇게 어렵게 느껴지지 않는 것 같아 뿌듯하다.

profile
개발은삼순이발

0개의 댓글