TIL

TIL day 27

gbleem 2025. 1. 23. 20:36

1. 코딩 테스트


오늘 오전에 코딩 테스트 문제로는 프로그래머스의 level 2 n진수 게임을 풀었습니다.

https://school.programmers.co.kr/learn/courses/30/lessons/17687

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

  • 뭘로 풀지?
    • 0부터 차례대로 n진법으로 나열한 후(string으로 저장), m중에서 p번째 숫자로만 answer를 구성하면서 answer의 크기가 t가 되면 끝내는 식으로 구현하면 될 것 같다는 생각이 들었습니다.
    • 코드 설명
      • Solution 함수
        • 변수들 
          • cur은 int로 0부터 숫자를 하나씩 올려주면서 계산합니다.
          • length는 n진수로 바꾼 값을 저장한 전체 string의 크기입니다.
          • idx는 우리가 찾고자 하는 p번째 숫자의 인덱스입니다.
        • 흐름
          • while문은 answer의 길이가 t가 되는 순간 탈출하게 됩니다.
          • change 함수라는 n진수로 바꿔주는 함수를 통해 cur이라는 int를 temp라는 string으로 바꿔주고, total이라는 지금까지 모든 temp를 저장한 string과 length를 업데이트 해줍니다.
          • 다음으로, if문을 통해 현재 idx보다 length가 길거나 같은 경우(이 경우가 p번째 숫자를 지나치는 순간입니다)
            • answer과 idx를 업데이트 해주면 됩니다.
              • answer는 전체 데이터(total)의 [idx-1] 번째를 더해주고
              • idx는 m번의 반복 중에서 p번째를 찾는것이기 때문에 m을 더해줍니다.
          • 마지막으로 cur 값을 하나 증가시키면 됩니다.
      • change 함수
        • cur이라는 int를 n진수로 바꿔 string으로 return 해주는 함수입니다.
        • 추가적으로 check 함수를 통해 10보다 큰 숫자는 A로 바꿔주는 로직을 추가하였습니다.
          • check 함수는 n이 16일때 까지만 동작하기에 다른 더 좋은 방법이 있을 것 같습니다...
  • 정답 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;

string check(int temp)
{
    if (temp == 10)
    {
        return "A";
    }
    else if (temp == 11)
    {
        return "B";
    }
    else if (temp == 12)
    {
        return "C";
    }
    else if (temp == 13)
    {
        return "D";
    }
    else if (temp == 14)
    {
        return "E";
    }
    else if (temp == 15)
    {
        return "F";
    }
    else return "Z";
}

string change(int cur, int n)
{
    string res;
    while (cur >= n)
    {
        int temp = cur % n;

        if (check(temp) != "Z")
        {
            res += check(temp);
        }
        else
            res += to_string(cur % n);
        cur /= n;
    }
    if (check(cur) != "Z")
    {
        res += check(cur);
    }
    else
        res += to_string(cur);

    reverse(res.begin(), res.end());

    return res;
}

string solution(int n, int t, int m, int p)
{
    string answer = "";
    int cur = 0;
    int length = 0;
    int idx = p;
    string total;
    
    while (answer.size() != t)
    {
        string temp;
        temp = change(cur, n); //0 1 10 11 100
        length += temp.size();
        total += temp;

        if (length >= idx)
        {
            answer += total[idx - 1];
            idx += m;
        }
        cur++;
    }
    return answer;
}

 

 

 

2. 언리얼 과제 진행


이전에 들은 강의들을 토대로 첫번째 과제를 진행하였습니다.

  • 첫번째 과제의 목표는 C++를 이용하여, 간단한 퍼즐 스테이지를 구현하는 것입니다.
    • 필수 과제 목록은 아래와 같습니다.
      • 서로 다른 Actor 클래스 2개 이상 구현
      • Tick 함수 기반 동적 Transform 변경
      • 리플렉션 적용
    • 도전 과제 목록은 아래와 같습니다.
      • 시간 제한과 카운트다운 활용
        • FTimerHandle과 GetWorld()->GetTimerManager().SetTimer() 응용
      • 랜덤 퍼즐 생성
        • SpawnActor와 FMath::RandRange 활용
  • 오늘까지 구현한 내용은 다음과 같습니다. 
    • 필수 과제 목록 완료
    • 도전 과제 목록에서 SpawnActor를 사용하는 방식 빼고 구현 완료
  • 좀 더 구현해야 할 부분
    • Timer를 사용한 부분을 게임에서 쓸 수 있도록 좀 더 자연스럽게 구현하기 
      • 시간이 지나면, 단순히 뿅 사라지는 것이아니라 흔들리다가 떨어지도록
      • 충돌 처리 확인
      • 시간이 지나는 것의 기준을 BeginPlay가 아니라 캐릭터가 닿았을 때로 변경
    • 부서지는 Actor 만들기 (Chaos?)
    • 캐릭터 추가하기 (만들면서 애니메이션 관련 내용 블로그에 정리하기)
  • 과제 깃허브

https://github.com/GBL22M/SCC_CH3-6

 

GitHub - GBL22M/SCC_CH3-6

Contribute to GBL22M/SCC_CH3-6 development by creating an account on GitHub.

github.com

  • 지금까지 구현한 내용 모습

 

언리얼 C++를 오랜만에 하다보니, 생각보다 시간도 엄청 오래걸리고 막히는 부분도 많았던 것 같습니다.

과제를 완료하면, 구현한 내용들을 정리해서 글을 또 업로드 하도록 하겠습니다.