카테고리 없음

팀 "Chill Guys" 2025. 08. 11. 6회차 모임 회고

notes5742 2025. 8. 13. 11:37

개인별 결과

박성준

이번 학습을 통해 Gradient Boosting과 관련된 주요 개념 및 모델(XGBoost, LightGBM) 그리고 모델 선택 기준에 대해 정리해봤다.

Gradient Boosting:

-Deviance: 로그 우도를 기반으로 한 손실 함수로, 분류 문제에 주로 사용.

-Exponential: AdaBoost 알고리즘에 최적화된 손실 함수.

-Least Squares: 회귀 문제에 적합한 손실 함수.

-Sequential Learning: 이전 단계의 오차를 다음 단계에서 학습하여 모델 성능을 점진적으로 개선.

XGBoost와 LightGBM:

-Custom Objective: 1차 및 2차 도함수를 직접 구현해 사용자 정의 손실 함수를 설정 가능.

-Built-in Functions: 20개 이상의 다양한 손실 함수를 기본 제공.

-Advanced Features: 정규화(L1, L2), 결측치 처리, 병렬화로 효율성과 성능을 극대화.

모델 선택 기준:

-해석성: Random Forest는 직관적이고 이해하기 쉬움.

-최고 성능: XGBoost와 LightGBM은 높은 예측 성능을 제공.

-이론적 보장: SVM은 수학적 이론에 기반한 안정적인 성능 보장.

-점진적 학습: Gradient Boosting은 데이터가 점진적으로 추가될 때 적합.

 

권혁주

 유니티 게임 오브젝트 생성 및 이동에 대해서 이해했다. 오브젝트를 이동하는 과정에 대해서 집중적으로 정리했다;

1. 프로젝트 생성 시 기본 카메라는 원점(0, 0, 0) 오브젝트를 가리키도록 (0, 0, -10)으로 설정되어 있음

2. 이미지 Asset Project View에 넣고, Hierarchy View에서 2D 오브젝트를 생성

3. Inspector View에서 생성한 오브젝트의 컴포넌트 설정(Transform에서 Reset을 눌러 (0, 0, 0)으로 이동, Sprite Renderer Sprite으로 이미지 asset을 드래그하여 이미지 삽입)

4. Project View Assets에서

- C#Script 생성 및 코드 수정(까먹지 않고 오브젝트의 컴포넌트로 적용해야 합니다!)

위와 같은 코드로 오브젝트를 이동할 수 있음

- Time.deltaTime을 사용하여 Update 호출마다(1fps 마다) 오브젝트가 이동할 수 있도록 함

- 컴퓨터마다 fps가 다르므로 같은 시간에도 이동 거리가 다를 것 같지만, fps값이 클수록 delatTime의 값이 작아지기 때문에 이동 거리는 같아지게 됨

5. Unity가 제공하는 Input 클래스를 이용하면 단축키를 통해 오브젝트 이동 가능

- 단축키는 Edit  Project Settings  Input Manager 에서 확인할 수 있음

 또한 float value에 대해서 정리하며 마무리했다.

양진원

  두 개의 백준 문제를 풀었다. 1번 문제는 아래와 같다;

김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시작했다. 의심을 피했다고 생각한 형택이는 다시 게임을 켰다. 그 때 형택이는 잠시 코딩을 하는 사이에 자신의 게임 실력이 눈에 띄게 향상된 것을 알았다.

이제 형택이는 앞으로의 모든 게임에서 지지 않는다. 하지만, 형택이는 게임 기록을 삭제 할 수 없기 때문에, 자신의 못하던 예전 기록이 현재 자신의 엄청난 실력을 증명하지 못한다고 생각했다.

게임 기록은 다음과 같이 생겼다.

  • 게임 횟수 : X
  • 이긴 게임 : Y (Z%)
  • Z는 형택이의 승률이고, 소수점은 버린다. 예를 들어, X=53, Y=47이라면, Z=88이다.

X와 Y가 주어졌을 때, 형택이가 게임을 최소 몇 번 더 해야 Z가 변하는지 구하는 프로그램을 작성하시오.

 

입력: 각 줄에 정수 X와 Y가 주어진다.

출력: 첫째 줄에 형택이가 게임을 최소 몇 판 더 해야하는지 출력한다. 만약 Z가 절대 변하지 않는다면 -1을 출력한다.

제한:

  • 1 ≤ X ≤ 1,000,000,000
  • 0 ≤ Y ≤ X

먼저 1번은 다음과 같은 알고리즘으로 풀이하면 된다.

- long Z = (Y * 100) / X; --> 정수 나눗셈이라 소수점은 자동으로 버려짐

- if (Z >= 99) {
    System.out.println(-1);
    return;
} --> 승률이 99% 이상이면 아무리 게임을 더 해도 승률이 변할 수 없기 때문에 -1 반환

-  if (newZ > Z) { 
                answer = mid; 
                right = mid - 1; --> mid판을 더 했을 때 승률이 변하면 더 작은 값에서도 변하는지 왼쪽 범위 탐색

- else {    
        left = mid + 1; --> 승률이 변하지 않으면 더 많은 게임이 필요하므로 오른쪽 범위 탐색

 

다음으로 2번 문제는 아래와 같다; 

 드디어 전쟁은 전면전이 시작되었고, 서로 땅을 따먹기 시작했다.

현재 여러 지역은 한창 전쟁이 벌어지고 있는 상황인데, 어느 지역은 거의 전쟁이 마무리 단계로 가고 있다.

하지만 당신은 군대를 보낼 때 적군을 혼란시키기 위해서 우리 나라의 군대라는걸 표시하지 않고, 군대의 번호로 표시했다.

어느 땅에서 한 번호의 군대의 병사가 절반을 초과한다면 그 땅은 그 번호의 군대의 지배하에 놓이게 된다.

이때, 각 땅들을 지배한 군대의 번호를 출력하여라. 만약, 아직 전쟁이 한창중인 땅이라면 “SYJKGW”을 쌍 따옴표 없이 출력한다.

 

입력:

첫째 줄에는 땅의 개수 n(n<=200)이 주어진다. 그리고 두 번째 줄에서 n+1번째 줄에는 제일 처음에 숫자 Ti(i번째 땅의 병사수, Ti<=100,000)와, Ti개의 숫자 (각각 병사의 군대 번호)가 주어진다. i번째 땅의 j번째 병사 번호 Nij가 주어진다. ( | Nij | <= 2^31 )

 

출력:

첫째 줄에는 각각의 땅의 상태를 순서대로 출력한다. 만약 땅이 지배가 되어있다면 그 지배한 병사의 번호를 출력하고, 아니라면 “SYJKGW”을 쌍 따옴표 없이 출력한다.

 

2번은 다음과 같은 알고리즘으로 풀이하면 된다.

- for (int j = 0; j < t; j++) {
                soldiers[j] = sc.nextLong(); 
            } --> t는 각 땅의 병사 수. soldiers 배열에 군대 번호를 저장

- Map<Long, Integer> countMap = new HashMap<>();

  for (int j = 0; j < t; j++) {
      long num = soldiers[j];
      countMap.put(num, countMap.getOrDefault(num, 0) + 1);
  } --> countMap은 군대 번호의 등장 횟수를 저장. getOrDefault(num, 0)은 num이 처음 등장하면 0을 반환하므로 +1 하면 카운트가 증가

- long dominantArmy = 0;
  boolean found = false;
  for (Map.Entry<Long, Integer> entry : countMap.entrySet()) {
      if (entry.getValue() > t / 2) { /
          dominantArmy = entry.getKey();
          found = true;
          break;
      }
  } --> > t/2는 절반을 초과한다는 뜻. Map을 순회하며 땅의 어떤 군대 번호가 절반을 초과하면 dominantArmy에 번호를 저장하고 루프 종료

8.11. 6회차 모임