유전 알고리즘은 진화와 같은 방식으로 후보 해 집단을 개선합니다. 적합한 부모를 고르고, 결합하고, 무작위 돌연변이를 더합니다. 여기서 후보는 비트 문자열이고 적합도는 1의 개수입니다 (OneMax 문제).
테스트할 수 있도록 모든 무작위 선택이 주어집니다. N개의 문자열 (N은 짝수)로 N개의 자식을 쌍으로 만듭니다. 쌍 k = 0, 1, …, N/2 - 1에 대해:
- 선택: parent1은 토너먼트
tournaments[2k]의 승자이고 parent2는tournaments[2k + 1]의 승자입니다. 토너먼트[i, j]는population[i]와population[j]중 1이 더 많은 쪽이 이기며, 같으면population[i]가 이깁니다. - 교차 (c =
crossover_points[k]): 자식 2k = parent1[0:c] + parent2[c:], 자식 2k + 1 = parent2[0:c] + parent1[c:].
그다음 각 돌연변이 [child, position]를 순서대로 적용해 그 자식의 그 비트를 뒤집습니다.
ga_generation(population, tournaments, crossover_points, mutations)를 구현하세요.
입력
population: 길이가 L로 같은 N개의 비트 문자열.
tournaments: 집단 인덱스의 N개 쌍.
crossover_points: N/2개의 절단점. 각각 1 이상 L - 1 이하.
mutations: [child, position] 쌍 (비어 있을 수 있음).
출력
N개의 자식을 순서대로 반환합니다.
제약 조건
2 ≤ N ≤ 200 (N은 짝수), 2 ≤ L ≤ 64
0 ≤ 돌연변이 수 ≤ 1,000
예시
입력:
population = ["0000", "1111", "1100", "0011"]
tournaments = [
[0, 1],
[2, 3],
[1, 2],
[0, 3]
]
crossover_points = [2, 1]
mutations = [
[0, 0]
]
예상 출력:
["0100", "1111", "1011", "0111"]
설명
쌍 0: "1111"이 "0000"을 이기고, "1100"과 "0011"은 동점이므로 앞의 것이 이깁니다. 2비트 뒤에서 자르면 "1100"과 "1111". 쌍 1: 부모는 "1111"과 "0011", 1비트 뒤에서 자르면 "1011"과 "0111". 마지막으로 자식 0의 비트 0을 뒤집어 "0100".
입력:
population = ["10", "01"]
tournaments = [
[0, 1],
[1, 0]
]
crossover_points = [1]
mutations = []
예상 출력:
["11", "00"]
설명
두 문자열 모두 1이 하나이므로 각 토너먼트는 첫 번째 인덱스가 이깁니다: parent1 = "10", parent2 = "01". 1비트 뒤에서 자르면 "11"과 "00".
참고 자료
-
예시 1 미실행입력:
population = ["0000", "1111", "1100", "0011"] tournaments = [ [0, 1], [2, 3], [1, 2], [0, 3] ] crossover_points = [2, 1] mutations = [ [0, 0] ]예상 출력:["0100", "1111", "1011", "0111"]내 출력 -
예시 2 미실행입력:
population = ["10", "01"] tournaments = [ [0, 1], [1, 0] ] crossover_points = [1] mutations = []예상 출력:["11", "00"]내 출력
제출 시 4개의 숨겨진 테스트도 실행됩니다. 코드가 하나라도 실패하면 그 테스트를 볼 수 있습니다. 챌린지를 해결하면 모두 볼 수 있습니다.
Run Swift Online
Write, run, and debug Swift code online using a command-line Swift environment. Manage multiple files, save your workspace, and share code without installing Xcode.
🍎 이 Swift 온라인 실행기 소개
CodeUtility Swift Executor는 브라우저에서 곧바로 Swift 코드를 작성하고 실행할 수 있게 해줍니다 - Xcode, SDK, macOS 설정이 전혀 필요 없습니다. 격리된 샌드박스에서 실제 Swift 컴파일러를 실행하여 정확하고 네이티브한 Swift 동작을 제공합니다.
이 도구는 여러 Swift 버전 - 5.7, 5.9, 그리고 최신 릴리스를 - 지원하여 새로운 언어 기능을 탐색하고 기존 Swift 코드베이스와의 호환성을 유지할 수 있는 유연성을 제공합니다.
Swift 문법을 학습하거나 알고리즘을 테스트하고, iOS, macOS, 서버 사이드 Swift 코드를 실험하려는 개발자에게 안성맞춤이며, 로컬 도구나 시뮬레이터를 설치할 필요가 없습니다.
각 스니펫은 컨테이너화된 Swift 환경에서 안전하게 실행되어, 실제 컴파일러 피드백과 안전한 코드 실행을 보장합니다.
하나의 실행기에서 다중 파일 편집기, 격리된 실행 터미널, 런타임별 라이브러리, 영구 작업 공간, 공유 및 실시간 협업을 이용하세요.
이 실행기는 어떻게 사용하나요?
런타임을 선택하고 파일을 열거나 만든 다음 코드를 작성하고 실행을 선택하세요. 출력은 터미널에 표시되며, 로그인한 사용자는 작업 공간에 파일을 보관하고 라이브러리를 설치하며 공유를 통해 협업할 수 있습니다.
- 버전을 선택하고 현재 파일을 편집하거나 작업 공간의 다른 파일을 여세요.
- 코드를 실행하고 요청 시 터미널에 입력한 다음 저장된 실행 기록을 확인하세요.
- 작업에 둘 이상의 코드 조각이 필요하면 라이브러리, 작업 공간 도구, 공유 및 채팅을 사용하세요.
💡 초보자를 위한 Swift 기초 가이드
1. 변수와 상수 선언
Swift에서는 변수에 var, 상수에 let을 사용합니다.
var age = 30
let pi = 3.14159
var name = "Alice"
let isActive = true
// 상수는 다시 할당할 수 없습니다
// pi = 3.14 // ❌ 오류
2. 조건문 (if / switch)
로직에는 if, else if, else를 사용하고, 여러 분기에는 switch를 사용합니다.
let number = 2
if number == 1 {
print("하나")
} else if number == 2 {
print("둘")
} else {
print("그 외")
}
switch number {
case 1:
print("하나")
case 2:
print("둘")
default:
print("그 외")
}
3. 루프
Swift는 for-in, while, repeat-while 루프를 지원합니다.
for i in 0..<3 {
print(i)
}
var n = 3
while n > 0 {
print(n)
n -= 1
}
4. 배열
배열은 순서가 있는 값들의 모음을 저장합니다.
var numbers = [10, 20, 30]
print(numbers[1])
5. 배열 조작
append나 removeLast 같은 배열 메서드를 사용하세요.
var nums = [1, 2, 3]
nums.append(4)
nums.removeLast()
for n in nums {
print(n)
}
6. 콘솔 입출력
출력에는 print()를 사용합니다. 입력은 Swift Playgrounds나 Xcode에서 추가 작업이 필요합니다.
let name = "Alice"
print("안녕하세요, \(name)")
7. 함수
매개변수와 반환 값을 가진 재사용 가능한 함수를 정의하세요.
func add(a: Int, b: Int) -> Int {
return a + b
}
print(add(a: 3, b: 4))
8. 딕셔너리
딕셔너리는 키-값 쌍을 저장합니다.
var ages = ["Alice": 30]
print(ages["Alice"] ?? 0)
9. 오류 처리
Swift는 오류 처리에 do-catch를 사용합니다.
enum MyError: Error {
case runtimeError(String)
}
do {
throw MyError.runtimeError("문제가 발생했습니다")
} catch let error {
print(error)
}
10. 파일 I/O
Swift는 파일 I/O에 FileManager 또는 String 메서드를 사용합니다.
let text = "안녕 파일"
try text.write(toFile: "file.txt", atomically: true, encoding: .utf8)
let content = try String(contentsOfFile: "file.txt")
print(content)
11. 문자열 처리
count, contains, uppercased() 등의 메서드를 사용하세요.
let text = "안녕 세상"
print(text.count)
print(text.contains("세상"))
print(text.uppercased())
12. 클래스 & 객체
Swift는 class와 init을 사용해 OOP를 지원합니다.
class Person {
var name: String
init(name: String) {
self.name = name
}
func greet() {
print("안녕하세요, 저는 \(name)입니다")
}
}
let p = Person(name: "Alice")
p.greet()
13. 옵셔널
Swift는 ?와 !로 옵셔널 값을 다룹니다.
var name: String? = "Alice"
print(name ?? "알 수 없음")
if let unwrappedName = name {
print(unwrappedName)
}