본문 바로가기

내일배움캠프

내일배움캠프 언리얼트랙 4일차

다들 좋은 아..아ㅊ... 저는 좋지 않아요...컴퓨터가 고장났어요... 그것도 메인보드 고장이래요...아....오늘은 기분이 너무 안좋아요...그래도 공부에 집중해야죠..! 집중하다보면 이런 기분도 나아질거에요. 그럼 시작해봅시다!

2026 -04 - 23


오늘의 학습

- C

- UnrealEngine


 코드카타 

오늘 코드카타시간에 풀었던 문제 중 기억하고 있으면 좋은 함수와 로직을 정리해보고자 한다. 와 이건 진짜 확실하게 기억해두면 두고두고 써먹을 수 있다!

 

atoi()

ASCII to Integer. 문자열 숫자를 정수로 바꿔준다.

[ 문자열을 정수로 바꾸기 ] 문제에서 사용했다.

int solution(const char* s) {
    int answer = atoi(s);
    return answer;
}

만약, atio()를 사용하지 않고 구현하고자 한다면 문자를 하나씩 읽어서 숫자로 누적해야한다.

문자로 입력된 값에 그대로 정수를 곱하면 안된다.(나도 알고싶지 않았다.) 정수처럼 보이지만 값의 타입은 문자이기 때문이다. 그렇다면 문자로 입력된 값을 정수로 바꿔주는 과정이 필요하다. 위에처럼 atoi()를 사용할수도 있지만 다른 방법도 있다!

 

'0' 을 빼주는것이다. 어째서 문자 0을 빼기만 하면 되는걸까? 문자로 입력된 값들은 문자 코드값으로 저장이 된다는걸 기억해야한다.  예를 들어 ASCII에서 문자 1의 내부 숫자코드값은 49이고 문자 2의 내부 숫자코드값은 50이다. 문자 0은 48이다. 이렇게 숫자 문자들은 연속되는 번호를 가지고 있다. 숫자 문자 '3'을 예를 들어 본다면, 3의 문자 코드값은 51이고 그 값에서 문자0을 뺀다면 51 - 48 = 3이 된다.

'3' == 51
'0' == 48

'3' - '0'
51 - 48 = 3

즉, 보이기엔 문자이지만 컴퓨터 내부에선 숫자이기 때문에 이런 계산이 가능하다는 것! 와 뎡말 놀라워~~

 

위의 내용을 기반으로 코드를 구현해본다면 다음과 같다.

int solution(const char* s) {
    int answer = 0;
    int i = 0;
    int sign = 1;

    // 음수 처리
    if (s[0] == '-') {
        sign = -1;
        i++;
    }
    else if (s[0] == '+') {
        i++;
    }

    while (s[i] != '\0') {
        answer = answer * 10 + (s[i] - '0');
        i++;
    }

    return answer * sign;
}

 

 

sqrt()

square root. 제곱근을 구하는 함수.

[ 정수 제곱근 판별 ] 문제에서 사용했다.

long long solution(long long n) {
    long long a = sqrt(n);
    if(a * a == n){
        a += 1;
        return a * a;
    }
    return -1;
}

 

만약, sqrt()를 사용하지 않고 구현한다면 1부터 차례대로 제곱해보고 그 값을 비교해보면 된다. x*x==n인 x값이 제곱근이 되는것이다. 범위가 너무 커지는건 사양한다. x*x값이 n보다 커지면 안된다. 만약 n이 50이라 했을때, 7*7 = 49 이고 8*8은 64이다. x*x값이 n보다 커지면 정확히 맞는 값이 없다는 뜻이 되는것이다. 따라서 x*x<n이라는 조건이 필요하다. 해당 조건을 만족한 다음 x에 1을 추가하고 1을 추가한 x의 제곱값이 n과 일치하는지 검사한다.만약 일지한다면 x는 n의 제곱근이 되는 것이다. 아니라면 제곱근이 없다는 뜻. 문제에서는 (x+1)*(x+1)값을 요구하고 있으므로 n의 제곱근 x에 1을 더한 후 제곱한 값을 리턴한다. 

 

위의 내용을 기반으로 코드를 구현하면 다음과 같다.

long long solution(long long n) {
    long long x = 1;

    while (x * x < n) {
        x++;
    }

    if (x * x == n) {
        x++;
        return x * x;
    }

    return -1;
}

 


 [ C ] 

 

오늘은 조건문(if, if-else, if-else if-else, switch-case)과 반복문 중 while문에 대해 학습했다.
if문은 ‘만약에’라는 뜻으로, 특정 조건이 참일 때만 코드를 실행한다. 예를 들어 if(num < 102)는 “만약에 num이 102보다 작다면”이라는 의미가 된다.
if-else문은 ‘만약에 ~ 아니라면’이라는 뜻이다. if(num < 102){~} else {~~}는 “만약에 num이 102보다 작다면 ~를 실행하고, 아니라면 ~~를 실행한다”는 의미다.
if-else if-else문은 여러 조건을 순서대로 검사할 때 사용한다. if(num < 102){~} else if(num < 110){~~} else {~~~}는 “만약에 num이 102보다 작다면 ~, 아니면 110보다 작다면 ~~, 그 외의 경우에는 ~~~를 실행한다”는 뜻이다.
switch-case문은 하나의 변수 값을 기준으로 여러 경우를 나눌 때 사용한다. 조건식이 아니라 값 자체를 비교한다는 점에서 if문과 차이가 있다.


while문은 조건이 참인 동안 반복해서 실행되는 반복문이다. 예를 들어 while(i < 5)는 “i가 5보다 작은 동안 계속 반복한다”는 뜻이다. 반복문 안에서 값을 변화시키지 않으면 무한 반복될 수 있으므로 주의해야 한다.


 [ UnrealEngine ] 

조준까지 구현했던 어제에 이어 오늘은 총 발사, 데미지를 구현했다. 총 발사를 위한 input action을 추가하고 왼쪽 마우스 버튼으로 설정해주었다. 그리고 line trace by channel 노드를 사용하였다. line trace by channel은 레이저를 쏴서 무언가에 맞았는지를 판단한다. visibility채널을 기준으로 설정한다.

line trace by channel

노드를 연결하고 PIE버튼을 눌러 실행하면 총 발사 시 화면에 빨간 레이저가 나가는걸 확인할 수 있다. print string을 추가해서 확인해보니 60m 내 물체에 쏘았을때는 true, 60m 보다 먼 물체를 향해 쏘았을때는 false이다.(안맞았으니 false가 되는 것)

이펙트와 사운드를 추가해주었다. Muzzle Flash - 총 쏘면 총구에서 나오는 이펙트, Impact Effect - 총알이 물체에 닿을때 나오는 이펙트! 에셋스토어에서 적당한 에셋을 다운받아 적용시켜주었다.

(할때마다 느끼는건데 언리얼엔진 공부할때는 실행해보는게 제일 중요하다... 어느부분이 작동이 이상한지 알아낼수있으니까! )

(현재 컴퓨터 고장으로 스샷을 찍지 못했습니다. 튜터님 화면 복붙...ㅎ)

가장 중요한 잔탄 확인 할 수 있게 UI를 세팅해주고 목숨과 조준선도 적당한 위치에 배치해주었다.

와~ 이제 진짜 게임같다~


오늘은 컴퓨터 사망이라는 큰 이슈가 발생해서 멘탈이 조금 좋지는 않지만 큰 문제가 발생한 다음에는 큰 행운이 따라온다고 믿는다..! 그래도 무사히 수업을 들었고 복습도 했으며 이렇게 TIL까지 작성했으니 너무 상심하지는 않는다! 일단 수업때 컴퓨터를 사용해야하기 때문에 수리센터의 문의를 넣어놔야겠다. 고장 문제를 해결하기 위해 같이 머리를 맞대고 고민을 해준 팀원들과 튜터님께 감사인사 드립니다. ( _ _ )

설마 3재는 아니겠지...?

 

정신을 가다듬고 내일도 화이팅...!