Cos Pro 2급 1차_문제4번 C언어
#문제4 자연수가 들어있는 배열이 있습니다. 이 배열에서 가장 많이 등장하는 숫자의 개수는 가장 적게 등장하는 숫자 개수의 몇 배인지 구하려 합니다. 이를 위해 다음과 같이 간단히 프로그램 구조를 작성했습니다. 1단계. 배열에 들어있는 각 자연수의 개수를 셉니다. 2단계. 가장 많이 등장하는 수의 개수를 구합니다. 3단계. 가장 적게 등장하는 수의 개수를 구합니다. 4단계. 가장 많이 등장하는 수가 가장 적게 등장하는 수보다 몇 배 더 많은지 구합니다. 단, 몇 배 더 많은지 구할 때는 소수 부분은 버리고 정수 부분만 구하면 됩니다. 자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 매개변수로 주어질 때, 가장 많이 등장하는 숫자가 가장 적게 등장하는 숫자보다 몇 배 더 많은지 return ..
2024.03.29
Cos Pro 2급 1차_문제3번 C언어
#문제3 시작 날짜와 끝 날짜가 주어질 때, 두 날짜가 며칠만큼 떨어져 있는지(D-day)를 구하려 합니다. 이를 위해 다음과 같이 3단계로 간단히 프로그램 구조를 작성했습니다. (단, 윤년은 고려하지 않습니다.) 1단계. 시작 날짜가 1월 1일로부터 며칠만큼 떨어져 있는지 구합니다. 2단계. 끝 날짜가 1월 1일로부터 며칠만큼 떨어져 있는지 구합니다. 3단계. (2단계에서 구한 날짜) - (1단계에서 구한 날짜)를 구합니다. 시작 날짜의 월, 일을 나타내는 start_month, start_day, 끝 날짜의 월, 일을 나타내는 end_month, end_day가 매개변수로 주어질 때, 시작 날짜와 끝 날짜가 며칠만큼 떨어져 있는지 return 하도록 solution 함수를 작성했습니다. 이때, 위 구..
2024.03.29
Cos Pro 2급 1차_문제2번 C언어
#문제2 A 쇼핑몰에서는 회원 등급에 따라 할인 서비스를 제공합니다. 회원 등급에 따른 할인율은 다음과 같습니다. (S = 실버, G = 골드, V = VIP) 등급 할인율 "S" 5% "G" 10% "V" 15% 상품의 가격 price와 구매자의 회원 등급을 나타내는 문자열 grade가 매개변수로 주어질 때, 할인 서비스를 적용한 가격을 return 하도록 solution 함수를 완성해주세요. #####매개변수 설명 상품의 가격 price와 회원 등급 grade가 매개변수로 주어집니다. price는 100 이상 100,000 이하의 100단위 자연수입니다. grade는 "S", "G", "V" 세 가지 중 하나입니다. #####return 값 설명 할인한 가격을 return 하도록 solution 함수..
2024.03.29
Cos Pro 2급 1차_문제1번 C언어
#문제1 A 학교에서는 단체 티셔츠를 주문하기 위해 학생별로 원하는 티셔츠 사이즈를 조사했습니다. 선택할 수 있는 티셔츠 사이즈는 작은 순서대로 "XS", "S", "M", "L", "XL", "XXL" 총 6종류가 있습니다. 학생별로 원하는 티셔츠 사이즈를 조사한 결과가 들어있는 배열 shirt_size와 shirt_size의 길이 shirt_size_len이 매개변수로 주어질 때, 사이즈별로 티셔츠가 몇 벌씩 필요한지 가장 작은 사이즈부터 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요. 매개변수 설명 학생별로 원하는 사이즈를 조사한 결과가 들어있는 배열 shirt_size와 shirt_size의 길이 shirt_size_len이 solution 함수의 매개변수로 주어집니..
2024.03.29
no image
유니티 머신러닝 2(Unity ML-Agents)
자 이번에는 유니티 머신러닝 셋팅이 완료되었으니 바로 예제로 들어가보겠습니다! 가상환경 셋팅이 되지않으셨다면 https://dev-jen.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-1Unity-ML-Agents 유니티 머신러닝 1(Unity ML-Agents) 자세한 설명은 유니티 머신러닝 깃 허브에 잘 나와있습니다! https://github.com/Unity-Technologies/ml-agents/blob/develop/docs/Installation.md 유니티 머신러닝 깃허브 기준 설명서 -> docs -> Installation.md 로 들어가시 dev-jen.tistory.com 이 글을..
2024.03.19
no image
유니티 머신러닝 1(Unity ML-Agents)
자세한 설명은 유니티 머신러닝 깃 허브에 잘 나와있습니다! https://github.com/Unity-Technologies/ml-agents/blob/develop/docs/Installation.md 유니티 머신러닝 깃허브 기준 설명서 -> docs -> Installation.md 로 들어가시면 됩니다! 현재 2024년 3월 기준으로 블로그를 작성하였고 다른 블로그를 참고하여도 계속 버전 문제가 커서 유니티 머신러닝 깃허브를 직접 참고하여 블로그를 새로 작성해봅니다! 일단 준비물은 https://github.com/Unity-Technologies/ml-agents GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents T..
2024.03.19
no image
유니티 Unity 보스 드래곤(Boss Dragon) 기획[졸업작품]
이번에 게임 졸업작품을 제작하기전 졸업작품 기획입니다! 이번에 기획을 해보면서 기획도 중요하다는걸 깨달았다 예전에 잠깐 방학에 기획없이 친구들과 작은 게임 프로젝트를 진행했는데 확실히 방향과 틀을 잡고 시작하는것과 그냥 맨땅에 헤딩하는것과는 다르다는걸 느꼈다 게임제작이 기획대로 흘러갈지 모르겠지만 열심히 해보자@@
2024.01.29
no image
프로그래머스/C++ [PCCE 기출문제] 8번 / 창고 정리
문제 설명 선빈이는 게임을 즐기던 중 가지고 있는 물건이 너무 많아 창고 정리를 하기로 했습니다. 선빈이가 보유한 게임 속 창고는 여러 칸으로 나누어져 있고 각 칸에는 물건들이 담겨있습니다. 창고를 정리할 방법을 고민하던 선빈이는 같은 물건이 여러 칸에 나누어 들어있는 것을 발견하고 우선 같은 물건끼리 최대한 겹쳐쌓는 방식으로 창고를 정리하기로 했습니다. 선빈이의 창고에 들어있는 물건의 이름과 개수는 리스트 형태로 주어지며, 한 칸에 겹쳐질 수 있는 물건의 개수에는 제한이 없다고 가정합니다. 예를 들어 창고의 각 칸에 담겨있는 물건의 이름이storage = ["pencil", "pencil", "pencil", "book"], 각 물건의 개수가 num = [2, 4, 3, 1]이라면 연필과 책을 한 칸에..
2024.01.11
반응형

#문제4 자연수가 들어있는 배열이 있습니다. 이 배열에서 가장 많이 등장하는 숫자의 개수는 가장 적게 등장하는 숫자 개수의 몇 배인지 구하려 합니다. 이를 위해 다음과 같이 간단히 프로그램 구조를 작성했습니다.

1단계. 배열에 들어있는 각 자연수의 개수를 셉니다.
2단계. 가장 많이 등장하는 수의 개수를 구합니다.
3단계. 가장 적게 등장하는 수의 개수를 구합니다.
4단계. 가장 많이 등장하는 수가 가장 적게 등장하는 수보다 몇 배 더 많은지 구합니다.

단, 몇 배 더 많은지 구할 때는 소수 부분은 버리고 정수 부분만 구하면 됩니다.

자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 매개변수로 주어질 때, 가장 많이 등장하는 숫자가 가장 적게 등장하는 숫자보다 몇 배 더 많은지 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 함수와 매개변수를 알맞게 채워주세요.


매개변수 설명

자연수가 들어있는 배열 arr와 arr의 길이 arr_len이 solution 함수의 매개변수로 주어집니다.

  • arr_len은 3 이상 1,000 이하의 자연수입니다.
  • arr에는 1 이상 1,000이하의 자연수가 들어있습니다.

return 값 설명

배열에서 가장 많이 등장하는 숫자가 가장 적게 등장하는 숫자보다 몇 배 이상 많은지 return 해주세요.

  • 가장 많이 들어있는 수의 개수와 가장 적게 들어있는 수의 개수가 같은 경우에는 1을 return 합니다.

예시

arr arr_len return

[1,2,3,3,1,3,3,2,3,2] 10 2

예시 설명

배열에 1이 2개, 2가 3개, 3이 5개 들어있습니다.

  • 가장 적게 들어있는 숫자 : 1 (2개)
  • 가장 많이 들어있는 숫자 : 3 (5개)

3이 1보다 2.5배 많이 들어있으며, 소수 부분을 버리고 2를 return 하면 됩니다.

문제

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* func_a(int arr[], int arr_len){
    int* counter = (int*)malloc(sizeof(int)*1001);
    for(int i = 0; i < 1001; i++)
        counter[i] = 0;
    for(int i = 0; i < arr_len; i++)
        counter[arr[i]]++;
    return counter;
}

int func_b(int arr[], int arr_len) {
    int ret = 0;
    for(int i = 0; i < arr_len; i++){
        if(ret < arr[i])
            ret = arr[i];
    }
    return ret;
}

int func_c(int arr[], int arr_len){
    const int INF = 1001;
    int ret = INF;
    for(int i = 0; i < arr_len; i++){
        if(arr[i] != 0 && ret > arr[i])
            ret = arr[i];
    }
    return ret;
}

int solution(int arr[], int arr_len) {
    int* counter = func_@@@(@@@);
    int max_cnt = func_@@@(@@@);
    int min_cnt = func_@@@(@@@);
    return max_cnt / min_cnt;
}

// The following is main function to output testcase.
int main() {
    int arr[10] = {1, 2, 3, 3, 1, 3, 3, 2, 3, 2};
    int arr_len = 10;
    int ret = solution(arr, arr_len);

    // Press Run button to receive output. 
    printf("Solution: return value of the function is %d .\\n", ret);
}

정답

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* func_a(int arr[], int arr_len){
    int* counter = (int*)malloc(sizeof(int)*1001);
    for(int i = 0; i < 1001; ++i)
        counter[i] = 0;
    for(int i = 0; i < arr_len; ++i)
        counter[arr[i]]++;
    return counter;
}

int func_b(int arr[], int arr_len) {
    int ret = 0;
    for(int i = 0; i < arr_len; ++i){
        if(ret < arr[i])
            ret = arr[i];
    }
    return ret;
}

int func_c(int arr[], int arr_len){
    int ret = 1001;
    for(int i = 0; i < arr_len; ++i){
        if(arr[i] != 0 && ret > arr[i])
            ret = arr[i];
    }
    return ret;
}

int solution(int arr[], int arr_len) {
    int* counter = func_a(arr, arr_len);
    int max_cnt = func_b(counter, 1001);
    int min_cnt = func_c(counter, 1001);
    return max_cnt / min_cnt;
}
반응형
반응형

#문제3 시작 날짜와 끝 날짜가 주어질 때, 두 날짜가 며칠만큼 떨어져 있는지(D-day)를 구하려 합니다. 이를 위해 다음과 같이 3단계로 간단히 프로그램 구조를 작성했습니다. (단, 윤년은 고려하지 않습니다.)

1단계. 시작 날짜가 1월 1일로부터 며칠만큼 떨어져 있는지 구합니다.
2단계. 끝 날짜가 1월 1일로부터 며칠만큼 떨어져 있는지 구합니다.
3단계. (2단계에서 구한 날짜) - (1단계에서 구한 날짜)를 구합니다.

시작 날짜의 월, 일을 나타내는 start_month, start_day, 끝 날짜의 월, 일을 나타내는 end_month, end_day가 매개변수로 주어질 때, 시작 날짜와 끝 날짜가 며칠만큼 떨어져 있는지 return 하도록 solution 함수를 작성했습니다. 이때, 위 구조를 참고하여 중복되는 부분은 func_a라는 함수로 작성했습니다. 코드가 올바르게 동작할 수 있도록 빈칸을 알맞게 채워주세요.


매개변수 설명

시작 날짜의 월, 일을 나타내는 start_month, start_day, 끝 날짜의 월, 일을 나타내는 end_month, end_day가 solution 함수의 매개변수로 주어집니다.

  • 잘못된 날짜가 주어지는 경우는 없습니다.
  • 끝 날짜는 항상 시작 날짜보다 뒤에 있는 날이 주어집니다.
  • 끝 날짜가 다음 해로 넘어가는 경우는 주어지지 않습니다.
    • 즉, start_month <= end_month를 항상 만족합니다.
    • start_month = end_month라면 start_day <= end_day를 항상 만족합니다.
  • 각 달의 날짜 수는 1월부터 순서대로 [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 이며, 윤년은 고려하지 않습니다.

return 값 설명

시작 날짜와 끝 날짜가 며칠만큼 떨어져 있는지 return 해주세요.


예시

start_month start_day end_month end_day return

1 2 2 2 31

예시 설명

시작 날짜는 1월 2일이고, 끝 날짜는 2월 2일입니다.

  • 1월 2일은 1월 1일로부터 1일만큼 지난 날입니다.
  • 2월 2일은 1월 1일로부터 32일만큼 지난 날입니다.
  • 32 - 1 = 31입니다.
  • 따라서 1월 2일과 2월 2일은 31일만큼 떨어져 있습니다.

문제

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int func_a(int month, int day){
    int month_list[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int total = 0;
    for(int i = 0; i @@@; i++)
        total +=  @@@;
    total +=  @@@;
    return total - 1;
}

int solution(int start_month, int start_day, int end_month, int end_day) {
    int start_total = func_a(start_month, start_day);
    int end_total = func_a(end_month, end_day);
    return end_total - start_total;
}

// The following is main function to output testcase.
int main() {
    int start_month = 1;
    int start_day = 2;
    int end_month = 2;
    int end_day = 2;
    int ret = solution(start_month, start_day, end_month, end_day);
    
    // Press Run button to receive output. 
    printf("Solution: return value of the function is %d .\\n", ret);
}

정답

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int func_a(int month, int day){
    int month_list[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int total = 0;
    for(int i = 0; i < month - 1; ++i)
        total += month_list[i];
    total += day;
    return total - 1;
}

int solution(int start_month, int start_day, int end_month, int end_day) {
    int start_total = func_a(start_month, start_day);
    int end_total = func_a(end_month, end_day);
    return end_total - start_total;
}
반응형
반응형

#문제2 A 쇼핑몰에서는 회원 등급에 따라 할인 서비스를 제공합니다. 회원 등급에 따른 할인율은 다음과 같습니다. (S = 실버, G = 골드, V = VIP)

등급 할인율

"S" 5%
"G" 10%
"V" 15%

상품의 가격 price와 구매자의 회원 등급을 나타내는 문자열 grade가 매개변수로 주어질 때, 할인 서비스를 적용한 가격을 return 하도록 solution 함수를 완성해주세요.


#####매개변수 설명 상품의 가격 price와 회원 등급 grade가 매개변수로 주어집니다.

  • price는 100 이상 100,000 이하의 100단위 자연수입니다.
  • grade는 "S", "G", "V" 세 가지 중 하나입니다.

#####return 값 설명 할인한 가격을 return 하도록 solution 함수를 작성해주세요.


#####예시

price grade return

2500 "V" 2125
96900 "S" 92055

예시 설명

예시 #1 2500원의 15%는 375원 입니다. 2500 - 375 = 2125 입니다.

예시 #2 96900원의 5%는 4845원 입니다. 96900 - 4845 = 92055 입니다.

문제

// You may use include as below.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int price, char* grade) {
    // Write code here.
    int answer = 0;
    return answer;
}

// The following is main function to output testcase.
int main() {
    int price1 = 2500;
    char* grade1 = "V";
    int ret1 = solution(price1, grade1);
    
    // Press Run button to receive output. 
    printf("Solution: return value of the function is %d .\\n", ret1);
    
    int price2 = 96900;
    char* grade2 = "S";
    int ret2 = solution(price2, grade2);
    
    // Press Run button to receive output. 
    printf("Solution: return value of the function is %d .\\n", ret2);
}

정답

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int price, char* grade) {
	int answer = 0;
	if (grade == "S")
		answer = price * 0.95;
	if (grade == "G")
		answer = price * 0.9;
	if (grade == "V")
		answer = price * 0.85;
	return answer;
}

이번에 실수한것

  • C언어라 소수에 f를 붙일필요가 없다
  • grade가 한 글자라 strcmp를 사용할 필요가없었는데 사용
반응형
반응형

#문제1 A 학교에서는 단체 티셔츠를 주문하기 위해 학생별로 원하는 티셔츠 사이즈를 조사했습니다. 선택할 수 있는 티셔츠 사이즈는 작은 순서대로 "XS", "S", "M", "L", "XL", "XXL" 총 6종류가 있습니다.

학생별로 원하는 티셔츠 사이즈를 조사한 결과가 들어있는 배열 shirt_size와 shirt_size의 길이 shirt_size_len이 매개변수로 주어질 때, 사이즈별로 티셔츠가 몇 벌씩 필요한지 가장 작은 사이즈부터 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.


매개변수 설명

학생별로 원하는 사이즈를 조사한 결과가 들어있는 배열 shirt_size와 shirt_size의 길이 shirt_size_len이 solution 함수의 매개변수로 주어집니다.

  • shirt_size_len은 1 이상 100 이하의 자연수입니다.
  • shirt_size 에는 치수를 나타내는 문자열 "XS", "S", "M", "L", "XL", "XXL" 이 들어있습니다.

return 값 설명

티셔츠가 사이즈별로 몇 벌씩 필요한지 가장 작은 사이즈부터 순서대로 배열에 담아 return 해주세요.

  • return 하는 배열에는 [ "XS" 개수, "S" 개수, "M" 개수, "L" 개수, "XL" 개수, "XXL" 개수] 순서로 들어있어야 합니다.

예시

shirt_size shirt_size_len return

["XS", "S", "L", "L", "XL", "S"] 6 [1, 2, 0, 2, 1, 0]

예시 설명

  • "XS"와 "XL"은 각각 한 명씩 신청했습니다.
  • "S"와 "L"은 각각 두 명씩 신청했습니다.
  • "M"과 "XXL"을 신청한 학생은 없습니다.

따라서 순서대로 [1, 2, 0, 2, 1, 0]을 배열에 담아 return 하면 됩니다.

문제

// You may use include as below.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int* solution(char* shirt_size[], int shirt_size_len) {
    // Write code here.
    int* answer;
    return answer;
}

// The following is main function to output testcase.
int main() {
    char* shirt_size[] = {"XS", "S", "L", "L", "XL", "S"};
    int shirt_size_len = 6;
    int* ret = solution(shirt_size, shirt_size_len);

    // Press Run button to receive output.       
    printf("Solution: return value of the function is {");
    for(int i = 0; i < 6; i++){
        if (i != 0) printf(", ");
        printf("%d", ret[i]);
    }
    printf("} .\\n");
}

정답

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

int* solution(char* shirt_size[], int shirt_size_len) {
    int* size_counter = (int*)malloc(sizeof(int)*6);
    for(int i = 0; i < 6; ++i)
        size_counter[i] = 0;
    for(int i = 0; i < shirt_size_len; ++i) {
        if(strcmp(shirt_size[i],"XS") == 0)
            size_counter[0]++;
        else if(strcmp(shirt_size[i],"S") == 0)
            size_counter[1]++;
        else if(strcmp(shirt_size[i],"M") == 0)
            size_counter[2]++;
        else if(strcmp(shirt_size[i],"L") == 0)
            size_counter[3]++;
        else if(strcmp(shirt_size[i],"XL") == 0)
            size_counter[4]++;
        else if(strcmp(shirt_size[i],"XXL") == 0)
            size_counter[5]++;
    }
    return size_counter;
}

몰랐던 부분

함수 **solution**의 시그니처를 보면 **int***과 char* shirt_size[] 두 가지 포인터가 나옵니다. 각각의 역할은 다음과 같습니다:

  1. int*: 이것은 함수의 반환 유형입니다. **int***은 정수를 가리키는 포인터를 나타냅니다. 이 함수는 정수형 포인터를 반환하는 것으로 정의되어 있으며, 반환된 포인터는 int 형식의 배열을 가리키게 됩니다.
  2. char* shirt_size[]: 이것은 함수의 매개변수입니다. **char* shirt_size[]**는 문자열을 가리키는 포인터 배열을 나타냅니다. 함수는 **shirt_size**라는 이름의 포인터 배열을 받으며, 각 포인터는 문자열을 가리키게 됩니다. 이 배열의 길이는 shirt_size_len 매개변수를 통해 전달됩니다.

strcmp(shirt_size[i],"XS") 에서도 strcmp 안에 2가지의 문자열을 비교해서 같다면 0을 반환 하는 것

반응형
반응형

자 이번에는 유니티 머신러닝 셋팅이 완료되었으니 바로 예제로 들어가보겠습니다!

 

가상환경 셋팅이 되지않으셨다면

https://dev-jen.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-1Unity-ML-Agents

 

유니티 머신러닝 1(Unity ML-Agents)

자세한 설명은 유니티 머신러닝 깃 허브에 잘 나와있습니다! https://github.com/Unity-Technologies/ml-agents/blob/develop/docs/Installation.md 유니티 머신러닝 깃허브 기준 설명서 -> docs -> Installation.md 로 들어가시

dev-jen.tistory.com

이 글을 보고 셋팅하고 와주세요!

 

 

에셋 파일에

ML-Agents -> Examples -> Scene 의 3DBall을 들어가서 실행해보시면 자동적으로 학습이 되어있는걸 확인하실수 있습니다.

Model에 학습이 되어있는 모델이 적용되어있습니다

 

저희는 직접 이 친구들을 가지고 학습을 시킬거기때문에

 

config 파일을 들어가셔서

 

ppo 알고리즘으로 제작되어있는 yaml 파일을 찾을겁니다

3DBall 파일을 복붙해서 저는 Test 파일이라고 이름을 지었습니다

2번째줄에 원래는 3DBall이라고 적혀있는데 저는 3DBall_Test라고 수정해줬고 

23번째줄이 원래는 50만번으로 설정되어있지만 저는 36000번만 학습하도록 해보겠습니다!

 

파일을 저장해주시고

3DBall 프리팹으로 들어가셔서 Agent를 클릭합니다. 그리고

Behavior Name을 아까 yaml 파일에서 수정한 3DBall_Test로 설정해주고 Model을 None으로 설정해줍니다!

 

자 이제 학습할준비가 끝났습니다.

아까 준비해둔 가상환경에서

mlagents-learn config/ppo/3DBall_Test.yaml --run-id=3DBall_Test1

이라고 명령어를 쳐줍니다

ppo 파일에 있는 3DBall_Test.yaml 파일을 이용해서 3DBall_Test1 이라는 파일을 만들어서 학습 결과를 result 파일에 저장해줄겁니다! 물론 3만6천번이 끝나야 저장을해줍니다! 50만번도 50만번이 다 돌아야 완전한 저장이 되더라구요!

다 실행되지않는다면 파일만 생성되고 더미 파일들만 생성되는거같습니다.

 

이런식으로 가상환경에 나온다면 성공입니다!

바로 실행을 누르시면

친구들이 빠르게 빠르게 학습을 진행합니다.

보통 1만2천번씩 하면서 중간에 한번씩 멈추더라구요.

 

 

자 이런식으로 3만6천번의 학습이 끝났고 results 파일을 확인해봅니다!

 

이 파일 자체를 유니티로 다시 옮겨줍니다!

 

그러면 3만 6천번을 학습한 Model이 이렇게 나오는데 아까 Model 적용하는법 알려드렸죠?

거기에 적용시키시면 됩니다!

기존에있었던건 아마 50만번을 학습시켜서 저희가 테스트로 제작한건 3만6천번이라 50만번보다는 공을 많이 떨어뜨리게 됩니다!

유니티 머신러닝 예제는 여기까지입니다 감사합니다!

 

반응형
반응형

자세한 설명은 유니티 머신러닝 깃 허브에 잘 나와있습니다!

https://github.com/Unity-Technologies/ml-agents/blob/develop/docs/Installation.md

유니티 머신러닝 깃허브 기준 설명서 -> docs -> Installation.md 로 들어가시면 됩니다!

 

현재 2024년 3월 기준으로 블로그를 작성하였고

다른 블로그를 참고하여도 계속 버전 문제가 커서 유니티 머신러닝 깃허브를 직접 참고하여 블로그를 새로 작성해봅니다!

 

일단 준비물은

https://github.com/Unity-Technologies/ml-agents

 

GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enab

The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinforcement ...

github.com

링크로 들어가셔서 

 

초록색 Code 버튼을 눌러 다운로드를 해줍니다!

 

현재 날짜 기준으로

  • Unity(2023.2 이상) 설치
  • Python(3.10.12 이상) 설치

라고 설명서에 나와있으므로 유니티허브를 다운로드해주시고

유니티 2023,2버전 이상과 파이썬 3.10.12 이상버전을 설치해줍니다!

저는 

유니티 2023.2.13f1 버전과 파이썬 3.11 버전을 설치하였습니다!

 

그리고 머신러닝은 가상환경에서 실행해야하기때문에

https://docs.conda.io/projects/conda/en/stable/

Conda에 들어가셔서 다운로드를 해줍니다!

 

모두 다운로드가 완료되었다면

 

검색을 하셔서 Anaconda Prompt (miniconda3) 를 실행해줍니다!

 

 

이런식으로 기본 가상환경 창이 나오는데

아까 맨 처음에 다운받았던 유니티 ml-agents-develop 로 들어가셔서 경로를 설정해줍니다!

저는 2번째라 2라고 적었으니 신경쓰지마세요!

 

경로로 들어가는법

cd C:\Users\Jean\Desktop\ml-agents-develop2\ml-agents-develop

각자의 경로로 들어가시길 바랍니다! 저는 바탕화면에 놔둬서 경로가 이런식으로 됩니다!

Jean은 제 이름이고 Desktop은 보통 바탕화면 입니다.

이 파일의 경로로 설정해주세요!

 

conda create -n mlagents python=3.10.12 && conda activate mlagents

명령어를 사용하여 파이썬 버전을 맞춰주고 conda를 사용하여 mlagents를 사용하여 가상환경을 셋팅해줍니다!

이런식으로 파이썬 버전3.10.12와  mlagents로 가상환경의 기본셋팅이 되었습니다! 

 

더 많은 예제를 다운로드 하고싶으시다면

git clone --branch release_21 https://github.com/Unity-Technologies/ml-agents.git

이 명령어를 사용하시면 됩니다! 저는 사용하지 않겠습니다.

 

자 이제 PyTorch를 설치해야하는데요 윈도우라면

pip3 install torch~=2.2.1 --index-url https://download.pytorch.org/whl/cu121

 

OS라면 GRPC 라이브러리를 설치합니다

pip3 install grpcio

 

둘중 하나만 하시면 돼요! 각자 맞는 운영체제로 다운하시면 됩니다!

 

 

자 이제 파이썬 패키지를 설치해야 합니다

2개의 명령어를 한줄씩 실행해줍니다!

python -m pip install ./ml-agents-envs
python -m pip install ./ml-agents

 

 

밑의 명령어도 실행해줍니다!

python -m pip install mlagents==1.0.0

 

 

마지막으로 파이토치에 필요한것과 나머지 명령어도 실행해주시면 됩니다!

pip3 install torch -f https://download.pytorch.org/whl/torch_stable.html
pip3 install -e ./ml-agents-envs
pip3 install -e ./ml-agents

 

 

이제 셋팅은 끝났습니다!

 

유니티에서 디스크에서 프로젝트 추가를 누르신다음

아까 저희가 지정했던 경로에 Project 파일이 있습니다.

이 프로젝트 파일로 프로젝트 추가를 눌러주시면 됩니다!

 

 

프로젝트가 열리는걸 기다려주세요!

다음 페이지에서 예제 다루는법을 소개하겠습니다!

 

반응형
반응형

 

이번에 게임 졸업작품을 제작하기전 졸업작품 기획입니다!

 

 

 

이번에 기획을 해보면서 기획도 중요하다는걸 깨달았다

예전에 잠깐 방학에 기획없이 친구들과 작은 게임 프로젝트를 진행했는데 확실히 방향과 틀을 잡고 시작하는것과

그냥 맨땅에 헤딩하는것과는 다르다는걸 느꼈다

게임제작이 기획대로 흘러갈지 모르겠지만 열심히 해보자@@

반응형
반응형

문제 설명

선빈이는 게임을 즐기던 중 가지고 있는 물건이 너무 많아 창고 정리를 하기로 했습니다. 선빈이가 보유한 게임 속 창고는 여러 칸으로 나누어져 있고 각 칸에는 물건들이 담겨있습니다. 창고를 정리할 방법을 고민하던 선빈이는 같은 물건이 여러 칸에 나누어 들어있는 것을 발견하고 우선 같은 물건끼리 최대한 겹쳐쌓는 방식으로 창고를 정리하기로 했습니다. 선빈이의 창고에 들어있는 물건의 이름과 개수는 리스트 형태로 주어지며, 한 칸에 겹쳐질 수 있는 물건의 개수에는 제한이 없다고 가정합니다.

예를 들어 창고의 각 칸에 담겨있는 물건의 이름이storage = ["pencil", "pencil", "pencil", "book"], 각 물건의 개수가 num = [2, 4, 3, 1]이라면 연필과 책을 한 칸에 각각 겹쳐 쌓아 간단하게 clean_storage = ["pencil", "book"], clean_num = [9, 1]로 만들 수 있습니다.

 

주어진 solution 함수는 정리되기 전 창고의 물건 이름이 담긴 문자열 리스트 storage와 각 물건의 개수가 담긴 정수 리스트 num이 주어질 때, 정리된 창고에서 개수가 가장 많은 물건의 이름을 return 하는 함수입니다. solution 함수가 올바르게 작동하도록 한 줄을 수정해 주세요.


제한사항

  • 1 ≤ storage의 길이 = num의 길이 ≤ 30
    • storage[i]는 영어 대소문자로 이루어져 있습니다.
    • 물건은 대소문자를 구분합니다. 즉, "Book"과 "book"은 서로 다른 물건입니다.
    • 1 ≤ storage[i]의 길이 ≤ 30
    • 1 ≤ num[i] ≤ 20
    • num[i]에는 storage[i]에 해당하는 물건의 개수가 담겨있습니다.
  • 가장 개수가 많은 물건이 두 가지 이상인 경우는 없습니다.
  • 한 칸에는 한 종류의 물건만 들어갈 수 있습니다.

입출력 예

storage num result

["pencil", "pencil", "pencil", "book"] [2, 4, 3, 1] "pencil"
["doll", "doll", "doll", "doll"] [1, 1, 1, 1] "doll"
["apple", "steel", "leaf", "apple", "leaf"] [5, 3, 5, 3, 7] "leaf"
["mirror", "net", "mirror", "net", "bottle"] [4, 1, 4, 1, 5] "mirror"

입출력 예 설명

입출력 예 #1

  • 본문에 설명된 대로 창고를 정리하면 clean_storage = ["pencil", "book"], clean_num = [9, 1]이 됩니다. 따라서 가장 개수가 많은 물건인 "pencil"을 return합니다.

입출력 예 #2

  • 창고를 정리하면 clean_storage = ["doll"], clean_num = [4]가 됩니다. 따라서 가장 개수가 많은 물건인 "doll"을 return합니다.

 

입출력 예 #3

  • 창고를 정리하면 clean_storage = ["apple", "steel", "leaf"], clean_num = [8, 3, 12]가 됩니다. 따라서 가장 개수가 많은 물건인 "leaf"를 return합니다.

 

입출력 예 #4

  • 창고를 정리하면 clean_storage = ["mirror", "net", "bottle"], clean_num = [8, 2, 5]가 됩니다. 따라서 가장 개수가 많은 물건인 "mirror"를 return합니다.

  • cpp를 응시하는 경우 리스트는 배열과 동일한 의미이니 풀이에 참고해주세요.
    • ex) 번호가 담긴 정수  numbers가 주어집니다. => 번호가 담긴 정수  numbers가 주어집니다.
  • java를 응시하는 경우 리스트는 배열, 함수는 메소드와 동일한 의미이니 풀이에 참고해주세요.
    • ex) solution 가 올바르게 작동하도록 한 줄을 수정해 주세요. => solution 가 올바르게 작동하도록 한 줄을 수정해 주세요.
#include <string>
#include <vector>

using namespace std;

string solution(vector<string> storage, vector<int> num) {
    int num_item = 0;
    vector<string> clean_storage(storage.size());
    vector<int> clean_num(num.size());
    
    for(int i=0; i<storage.size(); i++){
        int clean_idx = -1;
        for(int j=0; j<num_item; j++){
            if(storage[i] == clean_storage[j]){
                clean_idx = j;
                break;
            }
        }
        if(clean_idx == -1){
            clean_storage[num_item] = storage[i];
            clean_num[num_item] = num[i];
            num_item += 1;
        }
        else{
            clean_num[clean_idx] += num[i];
        }
    }
    
    // 아래 코드에는 틀린 부분이 없습니다.
    
    int num_max = -1;
    string answer = "";
    for(int i=0; i<num_item; i++){
        if(clean_num[i] > num_max){
            num_max = clean_num[i];
            answer = clean_storage[i];
        }
    }
    return answer;
}

 

반응형