Q. C#에서 객체가 사라지는 타이밍?

A. 객체가 사용(호출)이 되지 않을때 GC(가비지컬렉터)에서 제거를 함

C/C++과는 다르게 C#은 객체를 만들면 프로그래머가 따로 건드리지 않아도 사용되지 않으면 자동으로 제거된다고한다.

 

Q. 직렬화 와 역직렬화의 차이점?

A.

직렬화 : 외부에서 들어온 데이터를 코드영역 안에서 사용할 수 있게 변환하는것

역직렬화 : 코드영역에 있는 데이터를 외부로 꺼낼수 있게 변환하는것

 

Q. .csv 와 .json의 공통점,차이점 ?

A.

공통점 : 외부에서 관리되는 데이터 파일형들

차이점 :

.csv는 ( , ) 로 문자열을 구분하여 데이터를 관리함 , csv는 엑셀 파일로 셀 한칸마다 데이터 칸이기에 

.json은 배열,colletion 에 있는 구조들을 구체화 하여 관리에 능동적임

 

C# System.Text 에 속한 Json 패키지

using System.Text.Json;
using System.Text.Json.Serialization;
 
 // 1. 객체를 생성하고 JSON으로 직렬화하여 파일에 저장
 List<Quest> quests = new List<Quest>
 {
     new Quest("퀘스트1"),
     new Quest("퀘스트2"),
     new Quest("퀘스트3")
 };

 // 2. 리스트를 JSON 문자열로 직렬화
 string jsonString = JsonSerializer.Serialize(quests, new JsonSerializerOptions { WriteIndented =true});

 //3. 파일 경로 설정
 string filePath = "Quest.json";

 //4. JSON 문자열을 파일로 저장
 File.WriteAllText(filePath, jsonString);
 Console.WriteLine($"Serialized JSON list saved to {filePath}");

 // 5. JSON 파일을 읽어와서 리스트로 역직렬화
 if (File.Exists(filePath))
 {
     string loadedJsonString = File.ReadAllText(filePath);
     List<Quest> loadedQuest = JsonSerializer.Deserialize<List<Quest>>(loadedJsonString);

     //6. 역직렬화된 리스트 출력
     foreach (Quest quest in loadedQuest)
     {
         Console.WriteLine($"Loaded Quest: Label = {quest.Label}, Detail = {quest.Detail}, Finish = {quest.IsFinish}");
     }

 }

 

Q. 코드 컨벤션이란?

A. 협업시 코드를 어떤식으로 작성할건지 정하는 '약속' 이다.

개발 업무에서는 협업이 일상이기에 코드 컨벤션 만큼은 잘 지켜야한다.

 

Q. 코드 컨벤션을 쓰는 이유?

A.

1내 코드를 다른 사람이 쉽게 이해 할수 있도록
2.오랜 시간 뒤에 내가 내 코드를 알아보기 위해서
3.(중요) 취직하기 위해서
4.가독성

 

Q. 코드 컨벤션은 어떡해 쓰는건데?

A.

1.함수 중괄호 들여쓰기 방식

1-1.BSD 방식

Function()
{
  //CODE
}


1-2.K&R 방식

Function(){
  //CODE
}

 

2.코드컨벤션 규칙 :: 변수명을 정확히

//코드명을 목적에 맞춰서 이름만봐도 내용이 짐작이 되게 지어야한다.
Calss AScript (x) , Class TimeController (O)
float t (x) , float delayTime(O)
public float Get() (x) , public float GetDelayTime();

 

3.코드컨벤션의 종류
1.camelCase 소문자로 시작, 띄어쓰기 생략, 대문자로 구분
2.PascalCase 대문자로 시작, 띄어쓰기 생략, 대문자로 구분
3.snake_Case 소문자만 사용 ,띄어쓰기 대신 _ 사용
4.kebab-case 소문자만 사용 ,띄어쓰기 대신 - 사용

 

4.유니티에서의 컨벤션

유니티 엔진에서는  PascalCase 를 사용
하이어라키는 스페이스바를 허용하지만 개발자는 주로 사용X 

5.코드내에서의 컨벤션
5-1. [namespace], [class] , [struct] 는 파스칼을 사용
5-2. [함수]는 파스칼을 사용 , 함수 내부는 카멜을 사용
5-3. [Enum]는 파스칼을 사용
5-4. public 변수는 파스칼을 사용 ex) public int Num;
5-5. 나머지 변수는 _ + 카멜을 사용 ex) private int _num;

 

p.s 추가 정보

(현업에서는 언더바 잘 안씀)

(유니티는 _ 권장함) ::  ( _ 사용시 자동완성 기능 차단)

언더바( _ ) 이유는 클래스 안쪽(뒷쪽)에서 사용하는 거라고 명시하는거라고 합니다.

 

Q. 코드 컨벤션을 요약하면?

A.

1.유니티는 파스칼
2.덩치가 크거나(namespace,class,struct) 이거나 public이면 파스칼
3.non public이면 _ + 카멜
4.함수내부에서 쓰는것 카멜
5.(중요)이름 정할때 누가봐도 알 수 있도록
6. 들여쓰기 잘할것 (영역에 나눠서)
예시)for문 , Ctrl + k -> Ctrl + d 누르면 정렬 

SSC_Unity 6기 C# 문법 기초 인강 수강중에 정렬 알고리즘에 대해 수강하였고 기본 정렬 알고리즘은 직접 구현하는 일은 별로 없어도 어떡해 구현 되는지는 알고 있어야하며 특징 및 시간 복잡도는 나중에도 참고할것 같아 알고리즘 게시판을 만들어 따로 작성하였다.

 

https://01149.tistory.com/69

 

기본 정렬 알고리즘 4가지 :: 선택정렬, 삽입정렬, 퀵정렬, 병합정렬 (C# 구현) 간단 요약

1.선택정렬시간 복잡도 : Best : n^2Avg : n^2Worst : n^2정수 6만개 기준 Run-time (단위: sec) : 10.842 코드구현더보기 int[] arr; arr = new int[6] { 5, 2, 4, 6, 1, 3 }; for (int i = 0; i arr[j]) { int tmp = arr[j]; arr[j] = arr[i]; arr

01149.tistory.com

 

Q1.C#에서 외부파일 경로 설정?

A1.

using System.IO; //파일 입출력시 해당 네임스페이스 필요함

 //빌드하는 폴더 안에 "SaveFolder"라는 명칭의 폴더 생성
  Directory.CreateDirectory("SaveFolder");
  
//경로 설정하기
//Path.Combine(string path1,string path2) 은 .NET 프레임워크에서 제공하는 메서드이다
//path1 폴더 경로를 , path2는 파일 이름을 작성하면 해당 경로를 문자열로 반환해준다.
//직접 경로를 작성 할 수 있지만 지금처럼 작성하면 ,다른 유저의 컴퓨터에서도 원활하게 접속이 가능해진다
 string filePaths = Path.Combine("SaveFolder","playerSave.txt");

 

Q2.C#에서 .txt파일 읽기?

A2.

  
  //보통 외부 파일을 읽거나 쓸때 파일을 열고 작업을 다한 뒤 닫아줘야한다.
  //하지만 c#에서는 using 메서드를 사용하면 해당 작업 중에 열려있고
  //작업을 완료하면 자동으로 닫히게 된다.
  using (StreamReader reader = new StreamReader(filePaths))
  {
  	 //filePaths에 있는 .txt 파일을 읽는 코드 작성
     List<string> loadItemData = new List<string>(); //.txt 파일을 읽은 데이터를 저장

	 //스트림의 끝(End of Stream)**에 도달했는지를 확인하는 조건
     //즉, 읽는 .txt파일의 끝이 도달할때까지 반복문이 돌아간다.
     while (reader.EndOfStream == false) 
     {
	//.txt 파일의 문자열을 한줄을 가져오는 메서드
         string readData = reader.ReadLine();
         
         //Split을 이용한 데이터 분리 후
         string[] readDatas = readData.Split(',');
         
         //Item변수에 관련된 데이터 초기화 
         ItemID id = (ItemID)int.Parse(readDatas[0]);
         bool equip = readDatas[1] == "true" ? true : false ;
         string name = readDatas[2];
         string valueLabel = readDatas[3];
         float value = float.Parse(readDatas[4]);
         string info = readDatas[5];
         int count = int.Parse(readDatas[6]);
         int countMax = int.Parse(readDatas[7]);
         int buyGold = int.Parse(readDatas[8]);
     }
  }

 

Q3.C#에서 .txt파일 쓰기?

A3.

  
  //쓰기 스트림을 호출 후 없으면 해당경로(filePaths)에 파일을 생성
  using (StreamWriter writer = File.CreateText(filePaths))
  {
  	 //문자열을 하치기 위해 StringBuilder를 호출 (미리 만들어둔 클래스에서 호출된것)
      StringBuilder builder = StrBuild.strBuilder;
	  
      //Player class의 Item List를 가져와서 초기화 하는 코드내용
      foreach (KeyValuePair<ItemID,Item> itemData in player.Items)
      {
          builder.Clear();
          builder.Append($"{(int)itemData.Key},");
          builder.Append($"{itemData.Value.Equip},");
          builder.Append($"{itemData.Value.Name},");
          builder.Append($"{itemData.Value.ValueLabel},");
          builder.Append($"{itemData.Value.Value},");
          builder.Append($"{itemData.Value.Info},");
          builder.Append($"{itemData.Value.Count},");
          builder.Append($"{itemData.Value.CountMax},");
          builder.Append($"{itemData.Value.BuyGold},");
          
          //.txt파일에 해당 문자열을 저장하는 메서드
          writer.WriteLine(builder.ToString());
      } 
  }

Q1.배열이란?

A1.<동일한 데이터 유형>을 가지는 데이터 요소들을 한번에 모아서 다룰 수 있는 구조
선언된 크기 만큼 공간을 메모리에 할당받음 -> new int[10] ; //10개 int 변수(공간)을 할당받음

 

p.s

C/C++ 에서 2차원 배열 선언시 방식이 너무 달라서 적응이 힘들었음
C/C++ : int arr[2][3];

C# : int[,] arr = new int [2,3];

Q2.컬렉션이란?

A2.C#의 자료구조를 보관하고 있는 공간이며, C/C++로 치면 STL(Standard Template Library)와 유사함

using System.Collections.Generic

네임스페이스 안에 선언하고 사용함

 

p.s 컬렉션 안에 있는 자료구조 

1)List -> C++의 vector 생각하면됨(비슷함)
2)Dictionary -> C++의 unorderedamp 생각하면됨
key와 value값으로 나눠짐 , 중복된 키값을 가질수 없음 
3)Stack -> 선입후출(LIFO)
4)Queue -> 선인선출(FIFO)
5)HashSet -> C++의 Set 생각하면됨 ,중복되지 않음

 

배열 vs List (중요)

더보기

List는 삽입,삭제과 가능하여 매우 유용하지만 남발할경우 최적화에 좋지 않다.

 

1.메모리 사용량 증가 : 리스트는 동적배열이기에 크기 조정이 가능해짐
C# List가 제너릭으로 구성되어있고 내부가 동적배열 기반으로 되어있음
add도 메서드로 호출해서 추가하는 것,  

add의 방식을 간단히 설명하면 처음 초기화시 배열[4] 만들었다고 가정했을때

배열을 초과하는 숫자로 추가되는경우 배열[4]짜리를 지우고 배열크기를 2배로 늘려서 만듬


즉, 이러한 과정때문에 실제로 List를 사용시 처리비용이 매우큼
초기화시 .Capacity를 만들어 크기를 미리 선언 하면 최적화에 도움이 됨 

 

Q3.재귀호출이란?

A3.간단히 말하면 함수 자기자신을 호출하는 것
1.자기 자신 메서드를 호출하는 것을 의미
2.재귀 호출은 문제를 작은 부분으로 분할하여 해결하는 방법 중 하나
3.작은 부분의 해결 방법이 큰문제의 해결방법과 동일한 구조를 갖고 있는 경우 적합 -> 피보나치 수열
4.재귀 호출은 호출 스택에 호출된 메서드의 정보를 순차적으로 쌓고, 메서드가 반환되면서 스택에서
순차적으로 제거되는 방식으로 동작

 

(중요)

재귀 호출 활용과 주의점
1.복잡한 문제를 단순한 방식으로 해결하는 장점
2.종료조건을 명확하게 선언 , 무한 반복으로 인해 스택 오버플로우 발생 가능성
3.메모리사용량이 더크고 실행속도가 느림, 필요한 경우에만 적절히 사용 필요

 

Q4.구조체란?

A4.여러개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만들기 위한 방법
구조제는 값 형식(Value Type)으로 분류되며, 데이터를 저장하고 필요한 기능을 제공 함

 

구조체 vs 클래스 (중요)

더보기

공통점

1)모두 사용자 정의 형식을 만드는데 사용

차이점
2)구조체는 값(value)형식, 스택에 할당되고 복사될 때 값이 복사
3)클래스는 참조 형식힙에 할당되고 참조로 전달되므로 성능 측면에서 다소 차이가 있음.
4)구조체는 상속을 받을 수 없지만 , 클래스는 단일 상속 및 다중 상속이 가능하다.
5)구조체는 작은 크기의 데이터 저장이나 단순한 데이터 구조에 적합
6)클래스는 더 복잡한 객체를 표현하고 다양한 기능을 제공하기 위해 사용

C# 문법 종합반 1주차 

1.C#의 char은 2byte 이다.

C/C++ 에서는 1byte , C#은 단일문자인 char이 유니코드를 포맷하고있기에 2byte로 처리

 

C/C++
1.ASCII(아스키코드) 인코딩 사용 0 - 127까지 값으로 표현 할 수 있는 문자를 저장 가능
2.다국어 지원을 위해 wchar_t 타입을 사용하여 2바이트 이상 문자로 제어 가능

C#
1.UTF-16 인코딩을 사용하여 유니코드 문자를 저장 가능
2.유니코드 문자(UTF-16의 코드유닛)를 저장하기 위한 자료형으로 전 세계 다양한 문자집합 사용가능

 

2.리터럴 상수 : C#에서는 컴파일러에 의해 상수 값으로 처리 되며, 
변수나 상수에 할당되거나 연산에 사용

프로그램에서 직접 사용되는 상수 값  또는 소스코드에 직접 기록되어 있는 값을 의미함

ex) int num = 10  , int 0x10 (16진수 int) , 0b10 (2진수 int) ,3.14(double), 3.14f(float) , 문자열내 따옴표 사용하기 등등...

 

(중요)

3. 변수란 ? : 데이터(숫자,문자)를 저장하고 사용하기 위해 할당받은 공간

int num; //변수를 선언 ->데이터 저장을 위한 '공간'을 할당 받음)
num = 10; // 변수 초기화 (변수에 데이터를 대입,저장함)

 

(중요)

4.코드컨벤션 : 협업시 코드 작성시 지키는 약속

(밑에 예시대로 꼭 할 필요는 없음, 밑에는 대부분 이렇게 많이함)

4-1.식별자 표기법
PascalCase : 클래스 메서드 프로퍼티 , 단어의 첫글자는 대문자 이후에도 단어 첫글자 대문자
ex)ClassName,MethodName,
cameCase : 변수 , 매개변수, 로컬변수 ,단어의 첫글자는 소문자 이후로는 대문자
ex)variableName,paremeterName
대문자 약어 : 전부 대문자를 사용 , ID , HTTP,FTP 
4-2.들여쓰기 : 탭 또는 스페이스 4칸
4-3.중괄호 위치 항상 새로운 줄에 시작
4-4.빈줄 사용 : 관련 없는 코드 사이에는 빈줄을 사용하여 구분
메서드,클래스 등의 블록 사이에는 두줄을 띄어 씀

 

5.형변환 : 명시적 형변환 , 암시적 형변환

5-1.명시적형변환
int num1 = 10;
long num2 = (long)num1;

 

5-2.암시적 형 변환
1.작은 데이터 타입에서 더 큰 데이터 타입으로 대입
byte num1 = 10;
int num2 = num1;
2.리터럴 값
float result = 1;
3.정수형과 부동소수점 연산 수행 : 결과는 부동소수점으로 변환됨
int num1 =10;
float num2 = 3.14f;
float result = num1 + num2;

 

6.입력받은 문자열 Split으로 바로 분리하기

namespace Test
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.Write("이름을 입력하십시오 : ");
            string name = Console.ReadLine();
            Console.WriteLine("반갑습니다. 휴먼 - {0} ", name);

            Console.Write("두개의 숫자를 입력하십시오 : ");
            string input = Console.ReadLine();
			
            //문자열 입력 받아서 바로 분리해서 배열로 사용하기
            string[] numbers = input.Split(' '); // 문자열을 공백으로 구분하여 배열로 만듬
            int num1 = int.Parse(numbers[0]); //첫번째 값을 정소루 변호나하여 저장
            int num2 = int.Parse(numbers[1]); //두번째 값을 정소루 변호나하여 저장
			//
            
            int sum = num1 + num2;

            Console.WriteLine("{0} + {1} = {2}", num1, num2, sum);
        }
    }
}

 

7.var 키워드 : 변수를 선언시에 변수의 자료형이 컴파일러에 의해 자동으로 결정

사용 이유 :

1.변수 선언시 초기화 하는값의 자료형에 따라 변수의 자료형이 결정될때

2.변수 선언 시점에 자료형을 정확히 알 수 없는 경우

 

8.비트 연산 : 유니티에서 마스크레이어 체크할때 사용되기에 알아둬야함

(플래그 연산이라고도 함)

 

9.String 메서드 확인하기

Split('분리할 단일문자') : 문장을 분리자에 의 분리
IndexOf("검색할 단어") : 문장에서 해당 단어 검색 후 해단 문자열의 index 반환
Replace("검색 단어" , "대체 단어") : 검색한 단어위치를 대체 단어로 변경
문자열 -> 숫자 : int.Parse(string 변수);
숫자->문자열 : 숫자 변수.ToString();
비교1(문자열 값 비교) : str1 == str2 (bool 값 리턴)
비교2(문자열 대소 비교) : Compare(str1,str2) (int 값 리턴)
변수가 0보다 작으면 str1 < str2 / 변수가 0보다 크면 str1 > str2 

 

포멧팅 :
1. 문자열 형식화 : Format("{0} + {1}" ,num1 , num2);
2. 문자열 보간 : string message = $"{num1} + {num2}";

 

위에 메서드를 활용한 예시 코드

namespace Test
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string str1 = "Hello,World";
            string str2 = new string('h', 5);

            string str3 = str1 + " " + str2;
            Console.WriteLine(str3);

            string[] str4 = str1.Split(',');
            Console.WriteLine(str4[0]);
            Console.WriteLine(str4[1]);

            int index = str1.IndexOf("World");
            Console.WriteLine(index); //단어가 문장의 어디에 있는지 index로 반환함

            string newStr = str1.Replace("World", "Universe");
            Console.WriteLine(newStr);
            Console.WriteLine(str1);

            string str5 = "123";
            int num = int.Parse(str5);
            Console.WriteLine(num);

            num += 10;

            Console.WriteLine(num.ToString());
            Console.WriteLine(str1 == str2);
            Console.WriteLine(string.Compare(str1 ,str2)); // str1 - str2
            //대소비교시 아스키코드의 정수값을 가져오기에 소문자가 더욱 크다.

            string name = "John";
            int age = 30;
            string message = string.Format("My Name is {0} and {1}", name, age);
            Console.WriteLine(message);

            message = $"My Name is {name} and {age}";
            Console.WriteLine(message);
        }
    }


}

 

C# 문법 종합반 1주차 과제 제출

더보기
더보기
//1.이름과 나이를 입력 받고 출력하는 코드를 작성하세요
//namespace Test
//{
//    internal class Program
//    {
//        static void Main(string[] args)
//        {
//            Console.Write("이름을 입력 하십시오 : ");
//            string name = Console.ReadLine();
//            Console.Write("나이를 입력 하십시오 : ");
//            string age = Console.ReadLine();

//            Console.WriteLine("이름 : {0} / 나이 : {1} ", name, age);
//        }
//    }
//}

//2.두 수를 입력 받고 사칙연산의 결과를 출력하세요
//namespace Test
//{
//    internal class Program
//    {
//        static void Main(string[] args)
//        {
//            string[] numbers;
//            do
//            {
//                Console.Write("두 수를 입력해 주십시오 : ");
//                numbers = Console.ReadLine().Split(' ');

//                if(numbers.Length != 2)
//                {
//                    Console.WriteLine("\n문제 발생");
//                    Console.WriteLine("1.숫자가 두개 초과 및 미만입니다.");
//                    Console.WriteLine("2.숫자를 스페이스바로 분리하여 주십시오.");
//                    Console.WriteLine("다시 입력해주십시오.\n");
//                }

//            } while (numbers.Length != 2);



//            float num1 = float.Parse(numbers[0]);
//            float num2 = float.Parse(numbers[1]);

//            string result;

//            Console.WriteLine("덧셈 : {0} ", num1 + num2);

//            Console.WriteLine("뺄셈 : {0} ", num1 - num2);

//            result = string.Format("{0:N2}", num1 * num2);
//            Console.WriteLine("곱셈 : {0} ", num1 * num2);

//            result = string.Format("{0:N2}", num1 / num2);
//            Console.WriteLine("나눗셈 : {0} ", num1 / num2);
//        }
//    }
//}

//3.섭씨온도를 화씨온도로 변환하는 프로그램을 만들어주세요
//namespace Test
//{
//    internal class Program
//    {
//        static void Main(string[] args)
//        {
//            Console.Write("섭씨(C) 온도를 입력하십시오 : ");
//            float celsius = float.Parse(Console.ReadLine());

//            float fahrenheit = (celsius * 9 / 5) + 32;

//            string message = $"화씨(F) 온도 : {fahrenheit}";
//            Console.WriteLine(message);
//        }
//    }
//}

//4.BMI 지수를 계산하는 프로그램을 만들어봅시다
//BMI = 체중 / (신장^2)
//namespace Test
//{
//    internal class Program
//    {
//        static void Main(string[] args)
//        {
//            Console.Write("체중을 입력 하십시오 : ");
//            float weight = float.Parse(Console.ReadLine());

//            Console.Write("신장을 입력 하십시오 : ");
//            float height = float.Parse(Console.ReadLine());

//            float BMI = weight / (height * height) * 10000;

//            string result = string.Format("{0:N2}",BMI);
//            Console.Write("당신의 BMI 지수 : {0}", result);
//        }
//    }
//}

https://www.acmicpc.net/problem/15829

 

백준문제에 수식까지 다 알려주며 쉬운 문제를 하나 풀었는데 , 계속 정답체크가 안되서 찾아보았다.

 

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main(void)
{
    //a == 1 -> 'a' - 96 
    //int hash = ch - 96;

    int r = 31;
    unsigned long long m = 1234567891;
    unsigned long long sum = 0;

    int StrSize;
    string str;
    cin >> StrSize >> str;
    
    int* num = new int[StrSize];
    for(int i =0; i < StrSize;i++)
    {
        num[i] = str[i] - 96;
    }

    for(int i =0; i < StrSize; i++)
    {
        sum += (num[i] * (unsigned long long)pow(r,i)) % m  ;
    }

    cout << sum % m ;
    delete[] num;
}

제공해준 수식에는 제곱이 있어 그저 cmath 라이브러리의 pow()함수를 사용해서 풀려고 했으나,

문제가 계속 풀리지 않았었다.

 

하지만 원인은 오버플로우였었다. Pow에 타입캐스팅으로 unsigned long long 자료형도 선언했지만 Pow에서 Return하는 자료형은 이미 double이기에 i의 숫자가 49승만 되도 결국 오버플로우 발생한다.

 

그럼 해당 숫자를 받을 자료형이 없는가? 그건 아니다

정수론의 합동식 성질을 이용하는것이다. 

* 합동식이란 ??

합동식 표현 방법 / 모듈러 연산이라고도 한다.

 

합동식의 정수배 성질을 이용하여 문제를 해결한다.

해당 성질이 적용 됨으로
위의 방식도 적용이 된다.

즉, 해당 문제도 정답도 숫자 m을 나눈 나머지값을 원한다. 

pow함수를 쓰는게 아닌 직접 Pow함수를 선언하여 만들고

제곱할때마다 숫자 m (123456791)를 나눠서 나머지값을 구하고 오버플로우 나지 않게 대처하는것이였다.

 

밑에 코드는 위에 설명을 반영하여 고쳐서 제출하였다.

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

unsigned long long Pow(int a , int b)
{
    unsigned long long result = 1;
    for(int i = 0; i < b ; i++)
    {
    	//합동식의 성질이 잘 드러나는 부분
        result *= a;
        result %= 1234567891;
    }

    return result;
}

int main(void)
{
    //a == 1 -> 'a' - 96 
    //int hash = ch - 96;

    int r = 31;
    unsigned long long m = 1234567891;
    unsigned long long sum = 0;

    int StrSize;
    string str;
    cin >> StrSize >> str;
    
    int* num = new int[StrSize];
    for(int i =0; i < StrSize;i++)
    {
        num[i] = str[i] - 96;
    }

    for(int i =0; i < StrSize; i++)
    {
        sum += (num[i] * Pow(r,i));
    }

    cout << sum % m ;
    delete[] num;
}

 


공부해야될것 :: 오늘 유니티 미니프로젝트 발표가 있어 발표를하고 다른조들 작품을 보며 필요한 점을 배웠었다.

파티클을 스크린 뷰에서 표현 하게 할 수 있는것 : UI 의 카메라 렌더링 모드를 바꾸기 (12조)
우리가 흔히 보는 광고창이 스르륵 넘어가는 것을 유니티 컴포넌트로 구현 : 스크롤뷰 컴포넌트 사용하기 ( 6조 )

 

 

 

 
//총알을 180도로 아래 방향으로 총알의 방향벡터를 만드는 로직 
 void MakeCircle()
 {
     Vector3 targetPos = playerTransform.position;
     Vector3 myPos = new Vector3(0f, 1.4f, 0);
     Vector3 vectorToTarget = (targetPos - myPos).normalized;
     int n = 30;

     for(int i = 0; i < n; i ++)
     {
         GameObject MakeCircle = Instantiate(bullet, myPos, Quaternion.identity);
         Vector2 circleVec = new Vector2(Mathf.Cos((Mathf.PI) * i / n ), Mathf.Sin(-(Mathf.PI) * i / n ));
         MakeCircle.GetComponent<Rigidbody2D>().AddForce(circleVec * 30f);
     }
     
 }

삼각함수를 통해서 원하는 각도의 좌표방향을 알수있다.

 

Mathf.Cos()은 x축 방향을 의미, Mathf.Sin()은 y축 방향을 의미한다.

단위 원 일때 (반지름이 1인 원) Cos = 밑변 / 빚면인데 빚면은 반지름을 나타내고 결국 밑변은 x좌표값을 나타낸다.

즉 Cos(degree) = x 좌표를 의미한다. Sin도 이와 같은 의미를 취한다 .

 

Mathf.Cos()의 매개변수는 Radian값을 의미하므로 (Mathf.Pi / 180) * degree 라는 변환식을 사용하거나

DegtoRad 매크로 함수를 사용해셔 변환해서 사용하면된다. 

 

지금 위의 함수는 180도의 범위만 필요하기에  Mathf.Pi만 사용하였다. 

 


게임 개발에서 삼각함수는 뗄래야 땔수 없는 존재지만 오늘 개발중에 살짝 과부하가 와서

기억을 전혀 못했었다.. 공부를 다시 할 필요가 있다. 

+ Recent posts