TIL

TIL day 16

gbleem 2025. 1. 8. 20:29

1. 코딩 테스트

오늘 오전에는 프로그래머스 level 2 두 원 사이의 정수 쌍 문제를 풀었습니다.

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

 

프로그래머스

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

programmers.co.kr

  • 우연히 이 문제가 어제 풀었던, 점찍기 문제와 굉장히 유사한 문제였습니다. (TIL day 15참고)
  • 문제 풀이
    • 먼저 원 안에 해당하는 좌표를 찾는 것이기 때문에 1/4로 나눈 원에서 해당하는 좌표의 갯수의 4배를 하였습니다.
    • 범위에 들어오는 좌표들을 찾기 위해서는 x값을 고정시킨 후 최대 y값을 찾는 방식으로 구현하였습니다.
      • 이때 큰원(r2) 기준으로 모든 좌표를 구하고, 작은원(r1)을 기준으로 구한 좌표를 빼서 답을 냈습니다.
    • 항상 곱셈 연산에 있어서 long long 타입으로 연산을 해야 합니다.
    • 주의할 점
      • 아래 왼쪽 그림은 일반적인 상황입니다. minY(작은 원에서 구한 y값)의 값이 r1보다 항상 작은 경우입니다.
      • 그러나 오른쪽 같은 상황에서 문제가 발생합니다.
        •  r1이 5일때 x가 3이고 minY가 4인 상황
        • 예외 처리 코드가 없다면, 오른쪽 그림의 보라색 점들이 모두 빠져버려, 정답보다 작은 답이 나오게 됩니다.
        • 그래서 구한 minY값을 이용하여 if(minY*minY + x*x == r1*r1) 체크를 해준 후 값을 처리해주는 코드가 필요합니다.

  • 코드
#include <string>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;

long long solution(int r1, int r2) 
{
    long long answer = 0;
    
    for(int x = 1; x <= r2; ++x)
    {
        long long maxY = (long long)r2 * r2 - (long long)x * x;
        maxY = sqrt(maxY);  
                                            
        answer += (maxY + 1) * 4;          
    }     
    
    
    for(int x = 1; x < r1; ++x)
    {
        bool same = false;
        long long minY = (long long)r1 * r1 - (long long)x * x;                    
        minY = sqrt(minY);
        if((long long)minY*minY + (long long)x * x == (long long)r1*r1)
            same = true; 
        
        if(same)
        {
            answer -= (minY) * 4;
        }
            
        else
            answer -= (minY + 1) * 4;        
    }
    
    return answer;
}

2. 면접

갑자기 11월에 지원했던 기업에서 서류 합격 연락이 왔습니다. 시간도 많이 흘러서 잊어버리고 있었는데, 갑자기 면접 일정이 잡혀서 당황스러웠지만 기분은 좋았습니다. 

그래서 C++ 과 언리얼 위주로 면접 준비를 해보고자 관련 자료를 좀 찾아보고, 공부했습니다.

https://www.yamyamcoding.com/91c0b5c9-d4da-414a-8b24-35ccf8b8475c#2210f825433a4ae1a0cf3fb30856b23a

 

게임 프로그래머 취업 비법서(인터뷰 자료)

Notion 팁: 페이지를 생성할 때는 명확한 제목과 관련된 내용이 필요합니다. 인증된 정보를 사용하고, 페이지 주제를 확실히 하고, 주요 이슈에 대한 의견을 공유하세요.

www.yamyamcoding.com

관련 내용은 차차 정리해서 글로 작성해 보겠습니다. (오늘은 컨디션 이슈로...)

3. 건강

어제 새벽부터 몸살 기운이 있더니, 오늘 하루종일 힘이 없네요...

다들 건강 조심하세요ㅠㅠ

 

4. 과제 피드백

https://gbleem.tistory.com/27

 

UE_LOG 보충 (+ 과제)

1. 커스텀 로그 카테고리 만들기로그 카테고리는 CoreGloblals.h에 정의되어 있으며,우리가 출력 로그를 볼때 필터를 통해 원하는 로그만 체크해서 확인할 수도 있다.우리가 원하는 이름으로 로그

gbleem.tistory.com

이 글에서 언급했던, 과제에 대한 피드백을 받게 되어서 피드백 내용을 정리해 보겠습니다.

  • 캡슐화 개선
    • 구현한 Distance나 Step과 같은 함수는 Move 함수 내에서만 호출되기 때문에
    • private 영역으로 보내기
  • 반환 타입 일관성
    • int32_t를 쓸 것인지 int를 쓸 것인지!
    • 반환 타입을 일관성 있게 만들기
  • 유효성 검사
    • sqrt 함수 안에 음수나 overflow를 방지하도록 코드를 짜기
      • FLT_MAX를 사용해 보기
    • 이 내용은 사실 오늘 풀었던 코딩테스트 문제의 타입 설정과도 연관이 있었습니다.
      • long long으로 캐스팅 해서 곱연산과 합연산을 한 결과가 overflow가 나지 않도록 만들어 주었던 것이 생각났습니다.
      • distance 를 float로 선언했는데, 이 값이 유효할지 체크를 하는 코드를 추가하거나 double로 타입을 만들어 주거나...  상황에 맞는 방식을 사용하면 될 것 같습니다.
  • 매직 넘버 없애기
    • step을 총 10번 진행하기에 10이라는 매직넘버를 썼는데, 이 값을 상수로 만들기
  • 코딩 스탠다드
    • 멤버변수는 m 붙이지 말고, 파스칼 케이스 쓰기