XOR(배타적 논리합)은 뉴런 하나로는 풀 수 없지만 은닉층이 하나 있는 신경망으로는 풀 수 있는 고전적인 문제입니다. 입력 2개, 은닉 뉴런 2개, 출력 1개를 가지고 모두 sigmoid(σ(z) = 1 / (1 + e^(-z)))를 쓰는 신경망을 손실 L = (y - target)²로 학습시키세요.
학습 데이터는 모든 에포크에서 항상 이 순서대로 사용합니다.
| 입력 | target |
|---|---|
| [0, 0] | 0 |
| [0, 1] | 1 |
| [1, 0] | 1 |
| [1, 1] | 0 |
각 예제에 대해:
- 순전파: a_j = σ(x₁ × hidden_weights[j][0] + x₂ × hidden_weights[j][1] + hidden_biases[j]), y = σ(a₁ × output_weights[0] + a₂ × output_weights[1] + output_bias)
- delta_out = 2 × (y - target) × y × (1 - y), delta_j = delta_out × output_weights[j] × a_j × (1 - a_j). 이 예제의 갱신 전 가중치를 사용합니다
- 학습률 lr로 모든 매개변수를 갱신: output_weights[j] -= lr × delta_out × a_j, output_bias -= lr × delta_out, hidden_weights[j][i] -= lr × delta_j × x_i, hidden_biases[j] -= lr × delta_j
train_xor(hidden_weights, hidden_biases, output_weights, output_bias, learning_rate, epochs)를 구현하세요.
출력
학습 후 입력 [0, 0], [0, 1], [1, 0], [1, 1]에 대한 신경망의 예측 y를 이 순서대로 반환하세요.
제약 조건
0 ≤ epochs ≤ 5,000
0 < learning_rate ≤ 5
-2 ≤ 각 초기 가중치와 편향 ≤ 2
예시
입력:
epochs = 0
output_bias = 0.0
hidden_biases = [0.0, 0.3]
learning_rate = 1.5
hidden_weights = [
[0.2, 0.8],
[0.9, -0.7]
]
output_weights = [-0.6, 0.4]
예상 출력:
[0.482451, 0.436972, 0.494378, 0.452729]
설명
에포크가 0이면 아무것도 학습하지 않으므로, 결과는 초기 가중치로 한 순전파 그대로입니다: 약 [0.482, 0.437, 0.494, 0.453]. 학습되지 않은 신경망은 모든 입력에 거의 같은 답을 냅니다.
입력:
epochs = 2000
output_bias = 0.0
hidden_biases = [0.0, 0.3]
learning_rate = 1.5
hidden_weights = [
[0.2, 0.8],
[0.9, -0.7]
]
output_weights = [-0.6, 0.4]
예상 출력:
[0.015727, 0.982119, 0.985515, 0.013682]
설명
2,000 에포크 후 예측은 약 [0.016, 0.982, 0.986, 0.014]입니다: [0, 0]과 [1, 1]에서는 낮고 [0, 1]과 [1, 0]에서는 높습니다. 신경망이 XOR을 학습했습니다.
참고 자료
-
예시 1 미실행입력:
epochs = 0 output_bias = 0.0 hidden_biases = [0.0, 0.3] learning_rate = 1.5 hidden_weights = [ [0.2, 0.8], [0.9, -0.7] ] output_weights = [-0.6, 0.4]예상 출력:[0.482451, 0.436972, 0.494378, 0.452729]내 출력 -
예시 2 미실행입력:
epochs = 2000 output_bias = 0.0 hidden_biases = [0.0, 0.3] learning_rate = 1.5 hidden_weights = [ [0.2, 0.8], [0.9, -0.7] ] output_weights = [-0.6, 0.4]예상 출력:[0.015727, 0.982119, 0.985515, 0.013682]내 출력
제출 시 4개의 숨겨진 테스트도 실행됩니다.
온라인 C# 컴파일러 및 디버거
C#을 온라인에서 작성, 컴파일, 실행, 디버깅하세요. Visual Studio 없이 여러 파일 IDE에서 중단점, 단계별 실행, 객체 검사를 사용할 수 있습니다.
🔷 C# / .NET 온라인 실행기 소개
CodeUtility C# Executor는 브라우저에서 바로 실제 C# 코드를 작성하고 실행할 수 있게 해 줍니다 — 설치, Visual Studio 설정, .NET SDK가 필요 없습니다. .NET 런타임과 최신 C# 언어 버전(예: C# 9 이상)을 지원하는 안전한 샌드박스로 구동됩니다.
이 도구는 내부적으로 dotnet-script를 사용해 진짜 .NET 동작으로 코드를 컴파일하고 실행합니다. LINQ, async/await, 패턴 매칭, 제네릭 같은 기본부터 고급 C# 기능까지 자유롭게 실험해 보세요.
간단한 스크립트, 함수, 로직 흐름을 테스트하거나 클래스, 구조체, 상속, 인터페이스 같은 개념을 탐구할 수 있습니다 — 모두 깔끔하고 방해 요소 없는 코딩 환경에서요.
C#을 학습하든, 알고리즘을 시험해 보든, .NET 기능을 실험하든, CodeUtility C# Executor는 어떤 브라우저에서든 C# 코드를 즉시 실행할 수 있는 빠르고 안전하며 신뢰할 수 있는 방법을 제공합니다.
하나의 실행기에서 다중 파일 편집기, 격리된 실행 터미널, 런타임별 라이브러리, 영구 작업 공간, 공유 및 실시간 협업을 이용하세요.
이 실행기는 어떻게 사용하나요?
런타임을 선택하고 파일을 열거나 만든 다음 코드를 작성하고 실행을 선택하세요. 출력은 터미널에 표시되며, 로그인한 사용자는 작업 공간에 파일을 보관하고 라이브러리를 설치하며 공유를 통해 협업할 수 있습니다.
- 버전을 선택하고 현재 파일을 편집하거나 작업 공간의 다른 파일을 여세요.
- 코드를 실행하고 요청 시 터미널에 입력한 다음 저장된 실행 기록을 확인하세요.
- 작업에 둘 이상의 코드 조각이 필요하면 라이브러리, 작업 공간 도구, 공유 및 채팅을 사용하세요.
💡 위에서 바로 시도해 볼 수 있는 C# 기본 개념과 예제
1. 변수와 상수 선언
C#는 강한 타입의 변수 선언을 사용합니다. 컴파일 타임 상수에는 const, 런타임 상수에는 readonly를 사용하세요.
int age = 30;
double pi = 3.14159;
char grade = 'A';
string name = "Alice";
bool isActive = true;
// 상수
const int MaxUsers = 100;
const string Company = "CodeUtility";
2. 조건문 (if / switch)
제어 흐름에는 if, else if, switch를 사용하세요.
int x = 2;
if (x == 1)
{
Console.WriteLine("One");
}
else if (x == 2)
{
Console.WriteLine("Two");
}
else
{
Console.WriteLine("Other");
}
switch (x)
{
case 1:
Console.WriteLine("One");
break;
case 2:
Console.WriteLine("Two");
break;
default:
Console.WriteLine("Other");
break;
}
3. 반복문
C#는 for, while, foreach 반복문을 지원합니다.
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}
int n = 3;
while (n > 0)
{
Console.WriteLine(n);
n--;
}
4. 배열
배열은 동일한 타입의 요소를 고정 크기로 저장합니다.
int[] numbers = { 10, 20, 30 };
Console.WriteLine(numbers[1]);
5. 리스트 조작
동적 컬렉션에는 List<T>를 사용하세요.
List<int> nums = new List<int> { 1, 2, 3 };
nums.Add(4);
nums.Remove(2);
foreach (int n in nums)
{
Console.Write(n + " ");
}
6. 콘솔 입력/출력
기본 I/O에는 Console.WriteLine과 Console.ReadLine을 사용하세요.
Console.Write("Enter your name: ");
string name = Console.ReadLine();
Console.WriteLine($"Hello, {name}!");
7. 함수
반환 타입, 이름, 매개변수를 사용해 메서드를 정의합니다.
int Add(int a, int b)
{
return a + b;
}
Console.WriteLine(Add(3, 4));
8. 딕셔너리
Dictionary<TKey, TValue>는 키-값 쌍을 저장합니다.
Dictionary<string, int> ages = new Dictionary<string, int>();
ages["Alice"] = 30;
Console.WriteLine(ages["Alice"]);
9. 예외 처리
실행 시 오류는 try, catch, finally로 처리합니다.
try
{
throw new Exception("Something went wrong");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
10. 파일 입출력
파일 작업에는 File과 StreamReader/StreamWriter를 사용하세요.
File.WriteAllText("file.txt", "Hello File");
string text = File.ReadAllText("file.txt");
Console.WriteLine(text);
11. 문자열 처리
C# 문자열은 Length, Substring, Contains 같은 메서드를 지원합니다.
string message = "Hello World";
Console.WriteLine(message.Length);
Console.WriteLine(message.Substring(0, 5));
Console.WriteLine(message.Contains("World"));
12. 클래스와 객체
C#는 클래스와 객체를 통해 객체 지향 프로그래밍을 지원합니다.
class Person
{
public string Name;
public Person(string name) => Name = name;
public void Greet() => Console.WriteLine($"Hi, I'm {Name}");
}
Person p = new Person("Alice");
p.Greet();