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을 더해줍니다.
- answer과 idx를 업데이트 해주면 됩니다.
- 마지막으로 cur 값을 하나 증가시키면 됩니다.
- 변수들
- change 함수
- cur이라는 int를 n진수로 바꿔 string으로 return 해주는 함수입니다.
- 추가적으로 check 함수를 통해 10보다 큰 숫자는 A로 바꿔주는 로직을 추가하였습니다.
- check 함수는 n이 16일때 까지만 동작하기에 다른 더 좋은 방법이 있을 것 같습니다...
- Solution 함수
- 정답 코드
#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?)
- 캐릭터 추가하기 (만들면서 애니메이션 관련 내용 블로그에 정리하기)
- Timer를 사용한 부분을 게임에서 쓸 수 있도록 좀 더 자연스럽게 구현하기
- 과제 깃허브
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++를 오랜만에 하다보니, 생각보다 시간도 엄청 오래걸리고 막히는 부분도 많았던 것 같습니다.
과제를 완료하면, 구현한 내용들을 정리해서 글을 또 업로드 하도록 하겠습니다.