개인별 결과
박성준
공군 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점이 된다.

계단 오르는 데는 다음과 같은 규칙이 있다.
- 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다.
- 연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다.
- 마지막 도착 계단은 반드시 밟아야 한다.
따라서 첫 번째 계단을 밟고 이어 두 번째 계단이나, 세 번째 계단으로 오를 수 있다. 하지만, 첫 번째 계단을 밟고 이어 네 번째 계단으로 올라가거나, 첫 번째, 두 번째, 세 번째 계단을 연속해서 모두 밟을 수는 없다.
각 계단에 쓰여 있는 점수가 주어질 때 이 게임에서 얻을 수 있는 총 점수의 최댓값을 구하는 프로그램을 작성하시오.
입력:첫째 줄에 계단의 개수가 주어진다.
둘째 줄부터 한 줄에 하나씩 제일 아래에 놓인 계단부터 순서대로 각 계단에 쓰여 있는 점수가 주어진다. 계단의 개수는 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글자보다 작거나 같다.
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"를 출력.
