유전 알고리즘은 진화와 같은 방식으로 후보 해 집단을 개선합니다. 적합한 부모를 고르고, 결합하고, 무작위 돌연변이를 더합니다. 여기서 후보는 비트 문자열이고 적합도는 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개의 숨겨진 테스트도 실행됩니다. 코드가 하나라도 실패하면 그 테스트를 볼 수 있습니다. 챌린지를 해결하면 모두 볼 수 있습니다.
Online Go Compiler
Write, compile, run, and debug Go code online in a full-featured browser IDE. Work with multiple files, save your workspace, and collaborate in real time - no setup required.
🐹 이 Go 온라인 실행기에 대해
CodeUtility Go Executor는 브라우저에서 바로 Go 코드를 작성하고 실행할 수 있게 해 줍니다 - 설치, 설정, 로컬 환경이 전혀 필요 없습니다. 보안 샌드박스 기반으로 실제 Go 컴파일러 버전 1.19, 1.20, 1.21을 지원합니다.
이 도구는 클라우드에서 실제 Go 프로그램을 컴파일하고 실행하여, 실제와 같은 Go 환경을 제공합니다. 짧은 스니펫을 테스트하고, 패키지를 실험하며, 고루틴과 채널을 활용한 Go의 강력한 동시성 기능을 탐구할 수 있습니다.
변수, 함수, 구조체, 슬라이스, 맵, 인터페이스, 에러 처리 등 Go의 핵심 개념을 학습하고 연습하기에 안성맞춤입니다 - 로컬에 어떤 도구도 설치할 필요가 없습니다.
처음 Go를 접하든, 백엔드 로직을 시험하든, 동시성이 어떻게 동작하는지 배우든, CodeUtility Go Executor는 깔끔하고 빠른 브라우저 기반 환경에서 Go 코드를 즉시 실행하는 방법을 제공합니다.
하나의 실행기에서 다중 파일 편집기, 격리된 실행 터미널, 런타임별 라이브러리, 영구 작업 공간, 공유 및 실시간 협업을 이용하세요.
이 실행기는 어떻게 사용하나요?
런타임을 선택하고 파일을 열거나 만든 다음 코드를 작성하고 실행을 선택하세요. 출력은 터미널에 표시되며, 로그인한 사용자는 작업 공간에 파일을 보관하고 라이브러리를 설치하며 공유를 통해 협업할 수 있습니다.
- 버전을 선택하고 현재 파일을 편집하거나 작업 공간의 다른 파일을 여세요.
- 코드를 실행하고 요청 시 터미널에 입력한 다음 저장된 실행 기록을 확인하세요.
- 작업에 둘 이상의 코드 조각이 필요하면 라이브러리, 작업 공간 도구, 공유 및 채팅을 사용하세요.
💡 위에서 바로 시도해 볼 수 있는 Go 기초와 예제
1. 변수와 상수 선언
var 또는 :=로 변수를 선언합니다. 상수는 const를 사용하세요.
package main
var x int = 10
const Pi = 3.14
func main() {
name := "Alice"
isActive := true
println(x, Pi, name, isActive)
}
2. 조건문 (if / switch)
Go는 간결한 문법의 if-else와 switch 문을 지원합니다.
x := 2
if x == 1 {
println("하나")
} else if x == 2 {
println("둘")
} else {
println("기타")
}
switch x {
case 1:
println("하나")
case 2:
println("둘")
default:
println("기타")
}
3. 반복문
Go에는 for 하나만 있지만, while처럼 사용할 수도 있습니다.
for i := 0; i < 3; i++ {
println(i)
}
n := 3
for n > 0 {
println(n)
n--
}
4. 배열
배열은 크기가 고정입니다. 동적 리스트에는 슬라이스를 사용하세요.
var nums = [3]int{10, 20, 30}
println(nums[1])
5. 슬라이스 다루기
슬라이스와 내장 append, len, copy, 슬라이싱 문법을 사용하세요.
fruits := []string{"apple", "banana"}
fruits = append(fruits, "cherry")
fruits = fruits[1:] // 슬라이스
println(len(fruits))
for _, fruit := range fruits {
println(fruit)
}
6. 콘솔 입출력
fmt.Print, fmt.Scan, fmt.Println을 사용하세요.
import "fmt"
var name string
fmt.Print("이름을 입력하세요: ")
fmt.Scan(&name)
fmt.Println("안녕하세요", name)
7. 함수
함수는 func로 선언하며, 여러 값을 반환할 수 있습니다.
func greet(name string) string {
return "안녕하세요, " + name
}
message := greet("Alice")
println(message)
8. 맵
맵은 키-값 저장소입니다. make()로 선언합니다.
ages := map[string]int{"Alice": 30}
ages["Bob"] = 25
println(ages["Alice"])
9. 에러 처리
Go는 예외 대신 다중 반환값으로 에러를 처리합니다.
import "errors"
func fail() error {
return errors.New("문제가 발생했습니다")
}
err := fail()
if err != nil {
println(err.Error())
}
10. 파일 입출력
파일 읽기/쓰기는 os와 io/ioutil 패키지를 사용하세요.
import (
"fmt"
"os"
"io/ioutil"
)
ioutil.WriteFile("file.txt", []byte("안녕, 파일"), 0644)
data, _ := ioutil.ReadFile("file.txt")
fmt.Println(string(data))
11. 문자열 다루기
strings 패키지로 문자열을 처리하세요.
import "strings"
text := " Hello World "
println(strings.TrimSpace(text))
println(strings.ToUpper(text))
println(strings.ReplaceAll(text, "Hello", "Hi"))
words := strings.Split(text, " ")
fmt.Println(words)
12. 구조체와 객체
구조체를 사용해 메서드를 가진 사용자 정의 타입을 만들 수 있습니다.
type Person struct {
Name string
}
func (p Person) Greet() string {
return "안녕하세요, 저는 " + p.Name
}
p := Person{Name: "Alice"}
println(p.Greet())
13. 참조(포인터)
Go는 *와 &를 이용한 포인터를 지원합니다.
x := 10
ptr := &x
*ptr = 20
println(x) // 20