목록분류 전체보기 (274)
여름의 서재
Map Map은 키(Key)에 대응하는 값(Value)을 신속히 찾는 해시테이블(Hash table)을 구현한 자료구조이다. Go 언어는 Map 타입을 내장하고 있는데, "map[Key타입]Value타입" 과 같이 선언할 수 있다. 예를 들어 정수를 키로 하고 문자열을 값으로 하는 맵 변수 idMap을 선언하기 위해서는 다음과 같이 할 수 있다. var idMap map[int]string 이때 선언된 변수 idMap은 (map은 reference 타입이므로) nil 값을 갖으며, 이를 Nil Map이라 부른다. Nil map에는 어떤 데이타를 쓸 수 없는데, map을 초기화하기 위해 make()함수를 사용할 수 있다. package main func main() { var m map[int]string..
슬라이스 Go 배열은 고정된 배열크기 안에 동일한 타입의 데이타를 연속적으로 저장하지만, 배열의 크기를 동적으로 증가시키거나 부분 배열을 발췌하는 등의 기능을 가지고 있지 않다. 하지만 슬라이스는 배열과 달리 고정된 크기를 미리 지정하지 않을 수 있고, 차후 그 크기를 동적으로 변경할 수도 있고, 또한 부분 배열을 발췌할 수도 있다. Go Slice 선언은 배열을 선언하듯이 "var v []T" 처럼 하는데 배열과 달리 크기는 지정하지 않는다. 예를 들어, 정수형 Slice 변수 a를 선언하기 위해서 "var a []int" 처럼 선언할 수 있다. package main import "fmt" func main() { var a []int //슬라이스 변수 선언 a = []int{1, 2, 3} //슬라..
배열 배열의 선언은 "var 변수명 [배열크기] 데이타타입" 과 같이 하는데, 배열크기를 데이타타입 앞에 써 주는 것이 C, Java 같은 다른 언어들과 다르다. Go에서 배열의 배열크기는 Type을 구성하는 한 요소이다. 즉, [3]int와 [5]int는 서로 다른 타입으로 인식된다. 배열이 선언된 후에 각 배열의 요소를 인덱스를 사용하여 읽거나 쓸 수 있다. package main func main() { var a [3]int //정수형 3개 요소를 갖는 배열 a 선언 a[0] = 1 a[1] = 2 a[2] = 3 println(a[1]) // 2 출력 } 배열을 정의할 때, 초기값을 설정할 수도 있다. 초기값은 "[배열크기] 데이타타입" 뒤에 { } 괄호를 두고 초기값을 순서대로 적으면 된다. ..
클로저 Go 언어에서 함수는 Closure로서 사용될 수도 있다. Closure는 함수 바깥에 있는 변수를 참조하는 함수값(function value)를 일컫는데, 이때의 함수는 바깥의 변수를 마치 함수 안으로 끌어들인 듯이 그 변수를 읽거나 쓸 수 있게 된다. 아래 예제에서 nextValue() 함수는 int를 리턴하는 익명함수(func() int)를 리턴하는 함수이다. Go 언어에서 함수는 일급함수로서 다른 함수로부터 리턴되는 리턴값으로 사용될 수 있다. 그런데 여기서 이 익명함수가 그 함수 바깥에 있는 변수 i 를 참조하고 있다. 익명함수 자체가 로컬 변수로 i 를 갖는 것이 아니기 때문에 (만약 그렇게 되면 함수 호출시 i는 항상 0으로 설정된다) 외부 변수 i 가 상태를 계속 유지하는 즉 값을 ..
함수 Go에서 함수는 func 키워드를 사용하여 정의한다. func 뒤에 함수명을 적고 괄호 ( ) 안에 그 함수에 전달하는 파라미터들을 적게 된다. 함수 파라미터는 0개 이상 사용할 수 있는데, 각 파라미터는 파라미터명 뒤에 int, string 등의 파라미터 타입을 적어서 정의한다. 함수의 리턴 타입은 파라미터 괄호 ( ) 뒤에 적게 되는데, 이는 C와 같은 다른 언어에서 리턴 타입을 함수명 앞에 쓰는 것과 대조적이다. 함수는 패키지 안에 정의되며 호출되는 함수가 호출하는 함수의 반드시 앞에 위치해야 할 필요는 없다. 아래 예제는 say라는 함수를 정의한 예이다. say() 함수는 문자열 msg 파라미터를 하나 갖고 있으며, 리턴 값이 없으므로 별도의 리턴타입을 정의하지 않았다. package mai..
if 문 Go의 if 조건문은 아래 예제에서 보듯이 조건식을 괄호( )로 둘러 싸지 않아도 된다. 그리고 한가지 주목할 점은 if 문의 조건식은 반드시 Boolean 식으로 표현되어야 한다는 것이다. 이점은 C/C++ 같은 다른 언어들이 조건식에 1, 0 과 같은 숫자를 쓸 수 있는 것과 대조적이다. if k == 1 { println("One") } else if k == 2 { //같은 라인 println("Two") } else { //같은 라인 println("Other") } if 문에서 조건식을 사용하기 이전에 간단한 문장(Optional Statement)을 함께 실행할 수 있다. 즉, 아래 예제처럼 val := i*2 라는 문장을 조건식 이전에 실행할 수 있는데, 여기서 주의할 점은 이때 ..
변수 var 키워드 뒤에 변수명을 적고, 그 뒤에 변수타입을 적는다. 아래는 a 라는 정수(int) 변수를 선언한 것이다. var a int 변수 초기값을 할당할 수도 있다. 아래는 float32 타입의 변수 b 에 11.0 이라는 초기값을 할당한 것이다. varb float32 = 11. 일단 선언된 변수는 그 뒤의 문장에서 해당 타입의 값을 할당할 수 있다. a = 10 b = 12.0 동일한 타입의 변수가 여러 개 있을 경우, 변수들을 나열하고 마지막에 타입을 한번만 지정할 수 있다. var i, j, k int * 변수를 선언하면서 초기값을 지정하지 않으면, Zero Value를 기본적으로 할당한다. 즉, 숫자형에는 0, bool 타입에는 false, 그리고 string 형에는 ""(빈문자열)을 ..
📕 문제 https://www.acmicpc.net/problem/21610 21610번: 마법사 상어와 비바라기 마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기 www.acmicpc.net 💡 풀이법 1. 먼저 구름의 첫 위치의 좌표들을 clouds라는 deque에 담는다. 2. clouds를 돌면서 구름을 이동시킨 값을 다시 clouds에 넣는다. 이동시킨 자리에 위치한 칸의 물의 양을 1씩 증가 시켜준다. (이와 동시에 모두 0으로 채워진 N x N 의 격자 칸 is_clouds를 만들어서 구름이 있는 칸은 1로 바꿔준다. 3. 그 다음 다시 clouds를 돌면서..