A*는 게임과 로봇 공학에서 쓰이는 대표적인 경로 탐색 알고리즘입니다. f = g + h가 작은 순서로 칸을 탐색하는데, g는 지금까지 지불한 비용이고 h는 남은 비용에 대한 휴리스틱 추정치입니다.
격자에는 각 칸의 비용이 들어 있습니다. 칸에 들어가면 그 칸의 값만큼 비용이 들고, 0은 들어갈 수 없는 벽입니다. start에서 출발하며 (이 칸의 비용은 내지 않습니다) 위, 아래, 왼쪽, 오른쪽으로 이동할 수 있습니다.
휴리스틱으로 맨해튼 거리 |row - goal_row| + |col - goal_col|를 사용하는 A*를 쓰세요. 지나갈 수 있는 모든 칸의 비용이 1 이상이므로 이 휴리스틱은 과대평가하지 않으며, A*는 최적의 답을 반환합니다.
a_star_cost(grid, start, goal)를 구현하세요.
입력
grid: 칸 비용 행렬 (0 = 벽).
start, goal: [row, col] 형태의 위치.
출력
goal에 도달하는 최소 총비용을 반환합니다. 도달할 수 없으면 (start나 goal이 벽인 경우 포함) -1을 반환합니다.
제약 조건
1 ≤ 행 수, 열 수 ≤ 100
0 ≤ 각 비용 ≤ 9
예시
입력:
grid = [
[1, 1, 1],
[1, 0, 1],
[1, 1, 1]
]
start = [0, 0]
goal = [2, 2]
예상 출력:
4
설명
가운데는 벽입니다. 오른쪽으로 두 번, 아래로 두 번 (또는 아래 다음 오른쪽) 가면 비용 1인 칸에 4번 들어가므로 합계는 4입니다.
입력:
grid = [
[1, 9, 1],
[1, 9, 1],
[1, 1, 1]
]
start = [0, 0]
goal = [0, 2]
예상 출력:
6
설명
9를 곧장 지나가면 9 + 1 = 10이 듭니다. 아래로 내려가 맨 아래 행을 따라간 뒤 다시 올라가면 비용 1인 칸에 여섯 번 들어가므로 합계는 6입니다.
참고 자료
-
예시 1 미실행입력:
grid = [ [1, 1, 1], [1, 0, 1], [1, 1, 1] ] start = [0, 0] goal = [2, 2]예상 출력:4내 출력 -
예시 2 미실행입력:
grid = [ [1, 9, 1], [1, 9, 1], [1, 1, 1] ] start = [0, 0] goal = [0, 2]예상 출력:6내 출력
제출 시 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