사용 이유: 치트 및 테이블 다운로드가 우연히 빌드에서 실행되지 않도록 하기 위해

Conditional Compilation이라는 것은 컴파일러에게 "이 조건이 충족되면 이 코드를 컴파일해, 그렇지 않으면 무시해"라고 말하는 방법이야. 즉, 코드가 실제로 실행 파일에 포함될지 여부를 미리 정의하는 것이지!

조건부 컴파일은 여러 이유로 유용해:

  1. 플랫폼 별 코드: 안드로이드와 iOS, PC 등 다양한 플랫폼에서 동작해야 할 때 각 플랫폼에 맞는 코드만 컴파일할 수 있어.
  2. 디버깅: 개발 중에는 디버깅 코드가 필요하지만, 실제 릴리즈에서는 그런 코드를 빼고 싶을 때 사용해.
  3. 버전 관리: 예를 들어, 레거시 시스템과 새로운 시스템이 함께 동작해야 하는 경우, 조건부 컴파일을 이용해 구버전 코드와 신버전 코드를 분리할 수 있어.

C#과 Unity에서 많이 쓰이는 예시가 이런 것들이야:

#if UNITY_EDITOR
    // 에디터에서만 실행될 코드
#elif UNITY_ANDROID
    // 안드로이드에서만 실행될 코드
#elif UNITY_IOS
    // iOS에서만 실행될 코드
#endif

이렇게 하면, 해당 조건이 참인 경우에만 코드가 컴파일되고 실행되겠지. 😸🌟

많은 프로그래밍 언어가 이러한 조건부 컴파일을 지원해, 게임 개발뿐만 아니라 다양한 프로젝트에서도 쓸모있는 기능이야! 🎮💫

블로그 이미지

RIsN

,

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘

  • 기초를 다시 돌아보는 데 좋음
블로그 이미지

RIsN

,

[C#] IComparable

C# 2023. 5. 18. 13:33

C# 언어에서 IComparable 인터페이스는 오브젝트 간의 일반적인 정렬 순서를 제공하는 메서드를 정의합니다. 이 인터페이스를 사용하면 객체를 정렬할 수 있는 능력을 추가로 제공할 수 있습니다. 이는 배열 또는 리스트의 정렬 메서드와 같이, 순서가 필요한 상황에서 유용합니다.

IComparable 인터페이스는 단일 메서드 CompareTo를 정의하며, 이 메서드는 현재 인스턴스와 비교 대상이 되는 오브젝트를 매개변수로 받아들입니다.

public interface IComparable { 
	int CompareTo(object obj); 
}


CompareTo 메서드는 다음과 같이 동작합니다:

만약 현재 인스턴스가 매개변수로 제공된 오브젝트보다 "작을" 경우, 이 메서드는 음의 정수를 반환합니다.
만약 현재 인스턴스가 매개변수로 제공된 오브젝트와 "같을" 경우, 이 메서드는 0을 반환합니다.
만약 현재 인스턴스가 매개변수로 제공된 오브젝트보다 "클" 경우, 이 메서드는 양의 정수를 반환합니다.
따라서, IComparable을 구현하는 클래스를 작성할 때는 CompareTo 메서드를 통해 두 객체를 어떻게 비교할지 정의해야 합니다.

아래 예시는 Person 클래스가 IComparable 인터페이스를 구현하는 방법을 보여줍니다:

public class Person : IComparable {
	public string Name { get; set; } 
	public int CompareTo(object obj) { 
    	if (obj == null) return 1; 
        
        Person otherPerson = obj as Person; 
        if (otherPerson != null) return this.Name.CompareTo(otherPerson.Name); 
        else throw new ArgumentException("Object is not a Person");     
    } 
}


위 코드에서 Person 클래스의 CompareTo 메서드는 먼저 대상 오브젝트가 null인지 확인하고, 그 다음 대상 오브젝트가 Person 타입인지 확인합니다. 만약 대상 오브젝트가 Person이라면, 이 메서드는 string 타입의 Name 프로퍼티를 비교하여 결과를 반환합니다.

IComparable 인터페이스를 구현하면 Array.Sort()나 List.Sort() 등의 메서드를 사용하여 오브젝트를 쉽게 정렬할 수 있습니다.

블로그 이미지

RIsN

,
  • terminal에서 which dotnet으로 path 확인 후 넣기
    • 참고: path 마지막에 dotnet이 2번 들어갈 경우, 마지막 dotnet 폴더는 제거

 

블로그 이미지

RIsN

,

미로 생성 알고리즘

C# 2023. 2. 7. 09:18

Binary Tree 미로 생성 알고리즘

  • 오른쪽 방향으로 갈 지 아래 방향으로 갈 지를 랜덤으로 정함

Side Winder 미로 생성 알고리즘

  • 오른쪽 방향(한 방향)으로 가다가 아래 방향(다른 방향)으로 가야 하는 경우가 생기면 오른쪽으로 움직인 곳 중 랜덤으로 한 곳에서 정해서 감

참고 사이트: https://errorcode1001.tistory.com/9

'C#' 카테고리의 다른 글

[C#] IComparable  (0) 2023.05.18
[VSCode: Error] Mac OS에서 FSharp Path 에러 생길 때  (0) 2023.05.09
Javascript의 getInt16()를 C#으로 Convert  (0) 2022.12.20
GetHashCode  (0) 2021.04.23
백준 1193 : 분수찾기  (0) 2021.02.03
블로그 이미지

RIsN

,

Code

private short ByteToInt16(byte[] _byte, bool _littleEndian = false) {
    if(_littleEndian) {
        return (short)(_byte[0] | _byte[1] << 8);
    } else {
        return (short)(_byte[1] | _byte[0] << 8);
    }
}
private ushort ByteToUInt16(byte[] _byte, bool _littleEndian = false) {
    if(_littleEndian) {
        return (ushort)(_byte[0] | _byte[1] << 8);
    } else {
        return (ushort)(_byte[1] | _byte[0] << 8);
    }
}
  • Little Endian
    • Byte 저장 순서에 관한 것으로 낮은 바이트를 낮은 주소에 넣는다.
      • 반대는 Big Endian
      • 엔디언(Endian)이라는 용어가 나오는데, 이건 조너선 스위프트의 작품인 《걸리버 여행기》에서 유래한 단어다. 작중 릴리퍼트라는 난쟁이들이 사는 나라에서 달걀을 먹을 때 뭉툭한 끝을 깨먹은 사람들과 뾰족한 끝을 깨먹는 사람들이 자기들이 옳다며 논쟁을 벌이는데, 여기서 뭉툭한 끝을 깨먹는 사람들을 큰 끝(big end)을 깨먹는다고 ian을 붙여 big endian이라고 부르고, 반대의 경우를 작은 끝(little end)을 깨먹는다고 little endian이라고 부른다.
  • | or 연산
  • << 왼쪽 시프트 연산

P.S. getInt24()의 경우

private int ByteToInt24(byte[] _byte, bool _littleEndian = false) {
    if(_littleEndian) {
        return (int)(_byte[0] | _byte[1] << 8 | _byte[2] << 16);
    } else {
        return (int)(_byte[2] | _byte[1] << 8 | _byte[0] << 16);
    }
}
private uint ByteToUInt24(byte[] _byte, bool _littleEndian = false) {
    if(_littleEndian) {
        return (uint)(_byte[0] | _byte[1] << 8 | _byte[2] << 16);
    } else {
        return (uint)(_byte[2] | _byte[1] << 8 | _byte[0] << 16);
    }
}

'C#' 카테고리의 다른 글

[VSCode: Error] Mac OS에서 FSharp Path 에러 생길 때  (0) 2023.05.09
미로 생성 알고리즘  (0) 2023.02.07
GetHashCode  (0) 2021.04.23
백준 1193 : 분수찾기  (0) 2021.02.03
백준 2292 : 벌집  (0) 2021.02.02
블로그 이미지

RIsN

,

문제

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다.

이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼프가 1850년에 증명했다.

예를 들어, 10보다 크고, 20보다 작거나 같은 소수는 4개가 있다. (11, 13, 17, 19) 또, 14보다 크고, 28보다 작거나 같은 소수는 3개가 있다. (17,19, 23)

자연수 n이 주어졌을 때, n보다 크고, 2n보다 작거나 같은 소수의 개수를 구하는 프로그램을 작성하시오. 


입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 케이스는 n을 포함하는 한 줄로 이루어져 있다.

입력의 마지막에는 0이 주어진다.


출력

각 테스트 케이스에 대해서, n보다 크고, 2n보다 작거나 같은 소수의 개수를 출력한다.


코드

using System;
					
public class Program
{
	public static void Main()
	{
		// :: 소수 저장소 등록
		bool[] primes = new bool[(123456*2) + 1];
		
		// :: 1은 소수가 아님
		primes[1] = true;
		
		// :: 소수 등록
		for(int index = 2; index <= primes.Length - 1; index++) {
			// :: Next : 소수가 아닐 때
			if(primes[index])
				continue;
			
			// :: 소수 계산 : 자기 자신의 배수를 소수가 아니라고 등록
			for(int indexA = index + index; indexA <= primes.Length - 1; indexA += index) {
				primes[indexA] = true;
			}
		}
		
		// :: 출력 선언
		string print = "";
		
		// :: 연산
		while(true) {
			int num = int.Parse(Console.ReadLine());
			
			// :: EXIT : 0이면 나가기
			if(num == 0) break;
						
			// :: Count 획득
			int count = 0;
			for(int index = num + 1; index <= num*2; index++) {
				if(!primes[index]) count += 1;
			}
			
			// :: 카운트 기록
			print += count + "\n";
		}
		
		// :: 출력
		Console.WriteLine(print);
	}
}

참고

'C# > Baekjoon' 카테고리의 다른 글

백준 1929 : 소수 구하기  (0) 2022.03.31
백준 11653 : 소인수분해  (0) 2022.03.30
백준 2581 : 소수  (0) 2022.03.29
백준 1978 : 소수 찾기  (0) 2022.03.28
백준 10757 : 큰 수 A+B  (0) 2022.03.25
블로그 이미지

RIsN

,

문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.


출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.


코드

using System;
using System.Text;
					
public class Program
{
	public static void Main()
	{
		// :: 입력 M, N
		string[] input = Console.ReadLine().Split(' ');
		
		// :: 변환 : M, N
		int numMin = int.Parse(input[0]);
		int numMax = int.Parse(input[1]);
		
		// :: 참고 : 에라토스테네스의 체
		// :: https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4
		
		// :: 배열 제작 : 기본값 false
		bool[] primes = new bool[numMax +1];
		primes[1] = true; // : 1 예외 처리
		
		// :: 소수가 아닌 것에 : true 처리
		for(int index = 2; index * index <= numMax; index++) {
			// :: 소수일 때
			if(!primes[index]) {
				// :: 초기값은 소수 * 소수
				// :: 증가값은 +소수
				for(int multiple = index + index; multiple <= numMax; multiple += index) {
					primes[multiple] = true;
				}
			}				
		}
		
		// :: 출력 확인
		StringBuilder print = new StringBuilder(); // : string을 쓸 경우 개행 문제인지, 메모리 초과가 뜸
		for(int index = numMin; index <= numMax; index++)  {
			if(!primes[index]) {
				//Console.WriteLine(index);
				print.Append(index + "\n");
			}
		}
		
		// :: 출력
		Console.WriteLine(print);
	}
}

참고

  • string
    • string은 값 타입이 아닌 참조 변수
    • 문자열을 조합할 때마다 새로운 클래스가 생성
    • 문자열을 조합할 때마다 부하가 발생
  • StringBuilder
    • 새로운 변수를 사용하지 않고 결합

사이트 : 생각대로 살지 않으면 사는대로 생각한다. :: [C#] string 과 StringBuilder 사용 (tistory.com)

'C# > Baekjoon' 카테고리의 다른 글

백준 4948 : 베르트랑 공준  (0) 2022.04.06
백준 11653 : 소인수분해  (0) 2022.03.30
백준 2581 : 소수  (0) 2022.03.29
백준 1978 : 소수 찾기  (0) 2022.03.28
백준 10757 : 큰 수 A+B  (0) 2022.03.25
블로그 이미지

RIsN

,

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.


입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.


출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.


코드

using System;
					
public class Program
{
	public static void Main()
	{
		// :: 입력 : 소인수 분해할 것
		int num = int.Parse(Console.ReadLine());
		
		// :: EXIT : 1일 경우
		if(num == 1) return;
		
		// :: 소인수 분해
		string print = "";
		for(int index = 2; index <= num; index++) {
			// :: 0으로 나눠질 때
			if(num % index == 0) {
				// :: 나눈 것을 넣을 것
				num = num / index;

				// :: print에 소수 기록
				print += index.ToString();

				// :: 1이 되었으면 Break
				if(num == 1) {
					break;
				}
				// :: 아니면
				else {
					// :: 한줄 띄기 넣기
					print += "\n";
				}

				// :: 초기화
				index = 1;
			}
		}
		
		// :: 출력
		Console.WriteLine(print);
	}
	
	// :: 소수 구하기 : 이거 쓰면 시간 초과
	public static bool IsPrime(int num) {
		// :: 1이면 소수가 아님
		if(num == 1) return false;
		
		// :: 본래 수의 2를 나눈 것(제대로 이해는 안되지만, 반절까지)까지 나눴을 때 0이 되는 게 있는 지 확인
		for(int index = 2; index <= num / 2; index++) {
			if(num % index == 0) return false;
		}
		return true;
	}
}

 

'C# > Baekjoon' 카테고리의 다른 글

백준 4948 : 베르트랑 공준  (0) 2022.04.06
백준 1929 : 소수 구하기  (0) 2022.03.31
백준 2581 : 소수  (0) 2022.03.29
백준 1978 : 소수 찾기  (0) 2022.03.28
백준 10757 : 큰 수 A+B  (0) 2022.03.25
블로그 이미지

RIsN

,

백준 2581 : 소수

C#/Baekjoon 2022. 3. 29. 09:03

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.


입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.


출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.


코드

using System;
					
public class Program
{
	public static void Main()
	{
		// :: 입력 M
		int numM = int.Parse(Console.ReadLine());
		
		// :: 입력 N
		int numN = int.Parse(Console.ReadLine());
		
		// :: 선언 : 합, 최소값
		int max = 0;
		int min = 0;
		
		for(int index = numM; index <= numN; index++) {
			if(IsPrime(index)) {
				if(min == 0) min = index;
				max += index;
			}
		}
		
		// :: 출력
		if(min == 0) {
			// :: 없을 때 -1 표시
			Console.WriteLine(-1);
		} else {
			// :: 합, 최소값 출력
			Console.WriteLine(max + "\n" + min);
		}
	}
	
	// :: 소수 구하기
	public static bool IsPrime(int num) {
		// :: 1이면 소수가 아님
		if(num == 1) return false;
		
		// :: 본래 수의 2를 나눈 것(제대로 이해는 안되지만, 반절까지)까지 나눴을 때 0이 되는 게 있는 지 확인
		for(int index = 2; index <= num / 2; index++) {
			if(num % index == 0) return false;
		}
		return true;
	}
}

 

'C# > Baekjoon' 카테고리의 다른 글

백준 1929 : 소수 구하기  (0) 2022.03.31
백준 11653 : 소인수분해  (0) 2022.03.30
백준 1978 : 소수 찾기  (0) 2022.03.28
백준 10757 : 큰 수 A+B  (0) 2022.03.25
백준 2839 : 설탕 배달  (0) 2022.03.24
블로그 이미지

RIsN

,