카테고리 없음

팀 "Chill Guys" 2025. 07. 28. 4회차 모임 회고

notes5742 2025. 7. 29. 23:18

개인별 결과

박성준

 공군 IT개발관리병 면접을 준비하며 다양한 이론 및 실무 정보들을 공부했다. 친구를 위한 AI 비서를 Rule-Based로 구현한 토이 프로젝트도 마무리했으며, 벡터 DB를 원활하게 사용할 수 있도록 하기 위한 RAG 시스템의 구현 방식도 학습했다. 마지막으로, Loss Function의 개념과 관련된 모델들에 대한 학습을 추가로 진행했다.

 최근 AI 학습을 진행하다가, 기본적인 개념인 Loss Function을 잘 모르고 있는 나 자신을 발견했다. 꽤 자주 등장하는 개념같았는데 아직 이해를 못한 나를 반성하며 학습을 진행했다. 초반에는 개념 위주로 학습을 하다가, 수학적인 알고리즘까지 공부하고 나니 어려워보였던 개념이 기초 중에 기초 같다는 생각이 들었다. 알면 알수록 자신의 부족함을 볼 수 있는 곳이 바로 학문의 세계임을 깨닫는 시간이었다.

 

권혁주

 C# Script는 유니티에서 게임오브젝트에 종속되어 명령 제어, 게임 내 오브젝트 생성/삭제/관리, 게임 내 시스템 구현됨을 알았다. 활용하기 위해서는 Project View -> [+] -> C# Script으로 생성, Inspector View에서 확인, 더블클릭하여 Visual Studio에서 수정을 진행할 수 있다.

 최초 C# Script 내부는 다음과 같은 구조로 작성되어 있음을 확인했다. 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class ClassName : MonoBehaviour

{

void Start() { ... }

void Update() { ... }

}

 또한, C# 프로그래밍을 위한 기본 개념과 문법들을 상세하게 공부했다. 객체지향 프로그래밍 등 CS관련 지식도 정리하는 시간을 가졌다.

양진원

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

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다.

예를 들어 <그림 2>와 같이 시작점에서부터 첫 번째, 두 번째, 네 번째, 여섯 번째 계단을 밟아 도착점에 도달하면 총 점수는 10 + 20 + 25 + 20 = 75점이 된다.

계단 오르는 데는 다음과 같은 규칙이 있다.

  1. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다.
  2. 연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다.
  3. 마지막 도착 계단은 반드시 밟아야 한다.

따라서 첫 번째 계단을 밟고 이어 두 번째 계단이나, 세 번째 계단으로 오를 수 있다. 하지만, 첫 번째 계단을 밟고 이어 네 번째 계단으로 올라가거나, 첫 번째, 두 번째, 세 번째 계단을 연속해서 모두 밟을 수는 없다.

각 계단에 쓰여 있는 점수가 주어질 때 이 게임에서 얻을 수 있는 총 점수의 최댓값을 구하는 프로그램을 작성하시오.

 

입력:첫째 줄에 계단의 개수가 주어진다.

둘째 줄부터 한 줄에 하나씩 제일 아래에 놓인 계단부터 순서대로 각 계단에 쓰여 있는 점수가 주어진다. 계단의 개수는 300이하의 자연수이고, 계단에 쓰여 있는 점수는 10,000이하의 자연수이다.

 

출력: 첫째 줄에 계단 오르기 게임에서 얻을 수 있는 총 점수의 최댓값을 출력한다.

 

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

int[] stair = new int[n + 1]; -> i번째 계단의 점수를 저장. 0번의 인덱스는 사용하지 않기 위해 n+1로 선언

max[i]는 i번째 계단까지 도달했을 때 얻을 수 있는 최대 점수.

for (int i = 1; i <= n; i++) {
            stair[i] = sc.nextInt(); 
        } -> 계단 하나하나의 점수를 입력받음.

- max[1] = stair[1]; -> 첫 번째 계단은 무조건 밟으므로 그대로 점수로.

if (n >= 2) {
            max[2] = stair[1] + stair[2]; 
        } -> 두 번째 계단까지는 연속된 3칸을 밟는게 아니므로 1번+2번  밟는게 최댓값.

if (n >= 3) {
            max[3] = Math.max(stair[1] + stair[3], stair[2] + stair[3]);
        } -> 세 번째 계단은 1->3 또는 2->의 두 가지 경우가 있음. 둘 중 큰 값이 최댓값.

for (int i = 4; i <= n; i++) { -> 4번째 계단부터 일반적인 점화식 사용.

max[i - 2] + stair[i] -> i-2번째 계단까지의 최대 점수 + i번째 계단을 밟음.(=두 칸 전에서 바로 올라오기)
max[i - 3] + stair[i - 1] + stair[i] -> i-3번째까지의 최대 점수 + i-1번째 계단 + i번째 계단을 밟음.(=세 칸 전에서 한 칸 밟고 올라오기)

System.out.println(max[n]); -> n번째(마지막) 계단까지 도달했을 때의 최대 점수 출력.

 

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

세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다.

정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.

문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.

  • 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
  • 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
  • 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
  • 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
  • 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.

정민이를 도와 문자열이 주어졌을 때 균형잡힌 문자열인지 아닌지를 판단해보자.

 

입력:

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다.

입력의 종료조건으로 맨 마지막에 온점 하나(".")가 들어온다.
출력: 각 줄마다 해당 문자열이 균형을 이루고 있으면 "yes"를, 아니면 "no"를 출력한다.

 

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

- while (true) {
    String line = sc.nextLine();
    if (line.equals(".")) break; -> 입력이 "." 하나만 있는 경우에는 종료.

isBalanced는 중간에 균형이 깨졌는지 판단.

for (int i = 0; i < line.length(); i++) {
    char ch = line.charAt(i); -> 문자열을 한 글자씩 검사하면서 괄호 탐색.

- if (ch == '(' || ch == '[') {
    stack.push(ch);
} -> 열리는 괄호는 무조건 스택에 push.

else if (ch == ')') {
    if (stack.isEmpty() || stack.peek() != '(') {
        isBalanced = false;
        break;
    }
    stack.pop();
} -> 닫는 괄호가 등장했을 때 스택이 비어있거나 짝이 안 맞는 다른 종류의 괄호라면 균형이 깨진 것. isBalanced를 false로 바꾸고 반복문 종료.

else if (ch == ']') {
    if (stack.isEmpty() || stack.peek() != '[') {
        isBalanced = false;
        break;
    }
    stack.pop();
} -> 짝이 맞는 경우에는 스택에서 pop하여 해당 괄호 쌍을 제거.

- if (!stack.isEmpty()) isBalanced = false; -> 순회가 끝나고 스택이 비어있는지 확인.

System.out.println(isBalanced ? "yes" : "no"); -> isBalanced 값에 따라 "yes"나 "no"를 출력.

 

7.28. 4회차 모임