카테고리 없음

팀 "Chill Guys" 2025. 08. 04. 5회차 모임 회고

notes5742 2025. 8. 7. 01:03

개인별 결과

박성준

 SVM(Support Vector Machine) Random Forest에 대해서 공부했다. 먼저, SVM에 대해서는 Hinge Loss, Squared Hinge 등 힌지 손실과 관련된 개념들이 자주 등장했다. Hinge Loss는 max(0, 1 - y·f(x)) 마진 최대화로 적합하며, Squared Hinge는 미분가능성과 큰 오차 강한 패널티가 존재한다. Random Forest에서 Gini Impurity는 1 - Σpᵢ²를 통해 불순도 측정할 때 사용되며, Information Gain은 Entropy 기반 분할 기준이 된다. Majority Voting은 분류용이고 평균은 회귀용임을 알 수 있었다.

 잘 모르던 Loss Function에 대해서 깊은 탐구를 한 것 같아 좋았다. 오늘은 ML 모델들의 손실함수들 중 SVM과 Random Forest에 대해서 배웠다. 직접 코드로 실습해보니 이해도 잘됐다. 다음주에는 Gradient Boosting과 XGBoost/LightGBM, 그리고 손실함수 선택 기준 등을 공부해볼 예정이다.

 

권혁주

 유니티 이벤트 함수에 대해서 이해했다. 유니티 이벤트 함수의 정의와 종류에 대해 학습을 시작했다. 이후 초기화 이벤트 함수, 업데이트 이벤트 함수, 해체 이벤트 함수, 그리고 기즈모 이벤트 함수 등 여러 이벤트 함수들에 대해서 집중적으로 탐구했다.

양진원

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

화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.

  1. 자주 나오는 단어일수록 앞에 배치한다.
  2. 해당 단어의 길이가 길수록 앞에 배치한다.
  3. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다

보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.

 

입력:

첫째 줄에는 영어 지문에 나오는 단어의 개수 N과 외울 단어의 길이 기준이 되는 이 공백으로 구분되어 주어진다. (, )

둘째 줄부터 번째 줄까지 외울 단어를 입력받는다. 이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는 을 넘지 않는다.

단어장에 단어가 반드시 1개 이상 존재하는 입력만 주어진다.

 

출력: 

화은이의 단어장에 들어 있는 단어를 단어장의 앞에 위치한 단어부터 한 줄에 한 단어씩 순서대로 출력한다.

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

- HashMap<String, Integer> map = new HashMap<>(); --> key: 단어, value: 단어가 몇 번 나왔는지

- if (word.length() < M) continue; --> 너무 짧은 단어는 필요 없으므로 무시

- if (map.put(word, map.get(word) + 1)); --> 이미 나온 단어면 횟수+1

- else{ map.put(word, 1);} --> 처음 등장한 단어면 1부터 시작

- if (!map.get(a).equals(map.get(b))) {
    return map.get(b) - map.get(a); 
} --> 정렬 조건 1 (등장 횟수 많은게 먼저)

- if (a.length() != b.length()) {
    return b.length() - a.length();
} --> 정렬 조건 2 (긴게 먼저)

- return a.compareTo(b); --> 정렬 조건 3 (알파벳 사전순으로 작은게 먼저)

- for (String word : wordList) {
    System.out.println(word);
} --> wordlist의 값들을 word에 넣어 출력

 

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

상근이는 수학시간에 딴 짓을 하다가 선생님께 걸렸다. 선생님은 상근이에게 이번 주말동안 반성하라며 엄청난 숙제를 내주었다.선생님이 상근이에게 준 종이에는 숫자와 알파벳 소문자로 되어있는 글자가 N줄있다. 상근이는 여기서 숫자를 모두 찾은 뒤, 이 숫자를 비내림차순으로 정리해야한다. 숫자의 앞에 0이 있는 경우에는 정리하면서 생략할 수 있다. 글자를 살펴보다가 숫자가 나오는 경우에는, 가능한 가장 큰 숫자를 찾아야 한다. 즉, 모든 숫자의 앞과 뒤에 문자가 있거나, 줄의 시작 또는 끝이어야 한다. 예를 들어, 01a2b3456cde478에서 숫자를 찾으면 1, 2, 3456, 478이다. 선생님이 준 종이의 내용이 주어졌을 때, 상근이의 숙제를 대신하는 프로그램을 작성하시오.

입력:

첫째 줄에 종이의 줄의 개수 N이 주어진다. (1 ≤ N ≤ 100)

다음 N개의 줄에는 각 줄의 내용이 주어진다. 각 줄은 최대 100글자이고, 항상 알파벳 소문자와 숫자로만 이루어져 있다.

 

출력:

종이에서 찾은 숫자의 개수를 M이라고 하면, 출력은 M줄로 이루어져야 한다. 각 줄에는 종이에서 찾은 숫자를 하나씩 출력해야 한다. 이때, 비내림차순으로 출력해야 한다. 비내림차순은 내림차순의 반대인 경우인데, 다음 수가 앞의 수보다 크거나 같은 경우를 말한다.

 

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

- for (int i = 0; i < n; i++) {
    String line = sc.nextLine();
    String temp = "";  --> 한 줄을 통째로 이어받고 temp에 숫자를 이어붙이며 누적

- for (int j = 0; j < line.length(); j++) {
    char c = line.charAt(j);  --> charAt()으로 한 글자씩 확인

- if (c >= '0' && c <= '9') {
    temp += c;  
 --> 현재 문자가 수수자면 temp에 계속 붙여서 연속된 숫자 만듦

- else {
    if (!temp.equals("")) {
        numberList.add(Integer.parseInt(temp));
        temp = ""; 
    }
 --> 문자를 만났을 때 temp에 값이 있다면 정수로 변환해서 리스트에 저장하고 temp를 초기화

- if (!temp.equals("")) {
    numberList.add(Integer.parseInt(temp));
}  --> 줄이 숫자로 끝나는 경우도 따로 체크

- Collections.sort(numberList);  --> 오름차순으로 정렬

- for (int i = 0; i < numberList.size(); i++) {
    System.out.println(numberList.get(i));
 --> 리스트에 들어있는 숫자를 한 줄에 하나씩 출력

 

8.4. 5회차 모임