Trade-off Example: memoization 메모리를 많이 사용하여 시간을 비약적으로 줄이는 방법 Ch8
package main
import "fmt"
func main() {
array := []int{3, 5, 1, 2, 4}
summary := 0
// O(N)
for _,x := range array {
summary += x
}
// O(N^2)
N := 0
for i:= 0; i<len(array); i++ {
for j:= 0; j<len(array); j++ {
N++
}
}
fmt.Println(N)
}
package main
import "fmt"
func main() {
arr = []int{3, 5,1}
summary := 0
for _, x := range arr {
}
}
$O(N)$ 최악의 경우로 복잡도 고려
빅오 표기법 | 명칭 |
---|---|
O(1) | 상수시간 (Constant time) |
O(logN) | 로그시간 (Log Time) |
O(N) | 선형 시간 |
O(NlogN) | 로그 선형 시간 |
O(N^2) | 이차 시간 |
O(N^3) | 삼차 시간 |
O(2^n) | 지수 시간 |
Big-O는 최악의 경우 시간복잡도 e.g.Quick Sort O(NlogN)~O(N^2)
import time
# 측정 시작
start_time = time.time()
# 프로그램 소스코드
# 측정 종료
end_time = time.time()
elapsed_time = end_time - start_time
print(f"Time elapsed : {elapsed_time}")
package main
import (
"fmt"
"time"
"math/rand"
"sort"
)
func main() {
// 0~9정수 10개로 이루어진 int 슬라이스
rand.Seed(time.Now().UnixNano())
array := []int{}
n := 10
for i:=0; i< 10000; i++ {
// rand.Intn(n) returns non-negative pseudo-random int [0,n)
// It panics if n <= 0.
array = append(array, rand.Intn(n))
}
// fmt.Println(array)
// 1. 선택정렬
var min_index int
start_time := time.Now()
for i:=0; i<len(array); i++ {
min_index = i
for j:=i+1; j<len(array); j++ {
if array[j] < array[min_index] {
min_index = j
}
}
array[i], array[min_index] = array[min_index], array[i]
}
end_time := time.Now()
elapsed_time := end_time.Sub(start_time)
fmt.Println("Elapsed Time: ", elapsed_time)
// fmt.Println(array)
// Shuffle!
rand.Shuffle(len(array), func(i, j int){
array[i], array[j] = array[j], array[i]
})
// fmt.Println(array)
// 2. 기본라이브러리 Sort정렬
start_time = time.Now()
sort.Ints(array)
end_time = time.Now()
elapsed_time = end_time.Sub(start_time)
fmt.Println("Elapsed Time: ", elapsed_time)
// fmt.Println(array)
}
정수론, 최단경로, Dynamic Programming (Contest Competitive Coding Test)
Upper Bound : 문제 해결 역량 & 코드포스 블루이상, ACM-ICPC 서울지역 대회 본선 수준
기업 | 날짜 | 풀이 시간 | 문제 개수 | 커트라인 | 주요 문제 유형 | 시험 유형 |
---|---|---|---|---|---|---|
라인 | 상반기 (2020-04-05) |
2시간 30분 | 6문제 | 4문제 | 구현, 문자열, 자료구조 | 온라인 |
삼성전자 | 상반기 (2020-06-07) |
3시간 | 2문제 | 2문제 | 완전탐색, 시뮬레이션, DFS/BFS | 오프라인 |
// 1.
// 당신은 음식점의 계산을 도와주는 직원
// 카운터에 거스름돈으로 사용할 500,100,50,10원 동전 무한개존재
// 손님에게 거슬러줘야 할 돈 N원 일때 거슬러 줘야할 최소 동전 개수는?
// N은 항상 10의 배수이다.
package main
import (
"fmt"
)
func main() {
// N=1260 일떄 result = 6
var N int
fmt.Scanln(&N)
result := 0
coins := []int{500, 100, 50, 10}
for _,coin := range coins {
result += N / coin
N = N % coin
}
fmt.Println(result)
}
// 2.
// 큰수의 법칙
// 배열크기 N
// 더해지는 횟수 M
// 반복가능 횟수 K
package main
import (
"fmt"
)
func main() {
// 5 8 3
// 2 4 5 4 6 -> 6 5 4 4 2
// 6+6+6+5+6+6+6+5
var N,M,K int
fmt.Scan(&N, &M, &K)
in := make([]int, N)
for i := range in {
fmt.Scan(&in[i])
}
var first,second int
first = in[0]
for i:=0; i<N; i++ {
if first < in[i] {
second = first
first = in[i]
} else if second <in[i] {
second = in[i]
}
}
// a: K+1 이반복되는 횟수
a := M / (K+1)
// b: 마지막 사이클에서 반복적으로 더할 수 있는 횟수
b := M % (K+1)
result := a * (K*first + second) + b* first
fmt.Println(result)
}
// 3.
// 숫자카드게임
// N x M (행 x 열) 에서
// 먼저 행을 선택하고, 그 행에서 가장 작은 수를 뽑아서
// 가장 큰 수가 나오도록
// 3 3
// 3 1 2
// 4 1 4
// 2 2 2
// 2
package main
import (
"fmt"
)
func main() {
var N, M int
fmt.Scan(&N, &M)
var result int
var temp int
arr := make([][]int, N)
for i:=0; i<N; i++ {
temp_arr := make([]int, M)
for j:=0; j< M; j++ {
fmt.Scan(&temp_arr[j])
if j==0 {
temp = temp_arr[j]
}
if temp_arr[j] < temp {
temp = temp_arr[j]
}
}
arr[i] = temp_arr
if temp > result {
result = temp
}
}
fmt.Println(result)
}
// 4.
// 1이 될때까지
// 1. N에서 1을 뺀다
// 2. N을 K로 나눈다
// 1이 되는데 걸린 횟수 출력
package main
import (
"fmt"
)
func main() {
var N,K int
fmt.Scan(&N, &K)
count := 0
for N != 1 {
if N % K == 0 {
N /= K
count++
} else {
count += N - (N/K) *K
N = N/K * K
}
}
fmt.Println(count)
}
// top left (1,1) bottom right (N,N)
// 계획서 띄어쓰기 기준 L R U D 문자들이 반복적으로 적혀있음
// 움직일수 없는 곳 이동명령은 무시 됨
// 5
// R R R U D D
// 3 4
package main
import (
"fmt"
"os"
"bufio"
"strings"
)
func main() {
r,c := 1,1
var N int
fmt.Scanln(&N)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
line := scanner.Text()
for _, d := range strings.Fields(line) {
switch d {
case "L":
if c > 1 {
c -=1
}
case "R":
if c < N {
c +=1
}
case "U":
if r > 1 {
r -=1
}
case "D":
if r < N {
r +=1
}
default:
break
}
}
fmt.Println(r, c)
}
// 00시 00분 00초 ~ N시 59분 59초
// 3이 하나라도 포함되는 경우의 수
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
var N int
fmt.Scan(&N)
count := 0
// TODO
for h:=0; h<=N; h++ {
for m:=0; m<60; m++ {
for s:=0; s<60; s++ {
first := strings.Contains(strconv.Itoa(h), "3")
second := strings.Contains(strconv.Itoa(m), "3")
third := strings.Contains(strconv.Itoa(s), "3")
if first || second || third {
count++
}
}
}
}
fmt.Println(count)
}
// 체스판에서 (a~h, 1~8)
// 나이트 이동(2+1방식 이동)할 수 있는 개수
// a1
// 2
package main
import (
"fmt"
"os"
"bufio"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
c := scanner.Text()
// x: 1~8, y: 1~8
x := int(c[0]-96)
y := int(c[1]-48)
var count int
steps := [][]int{
[]int{1,2}, []int{-1,2}, []int{1,-2}, []int{-1,-2},
[]int{2,1}, []int{-2,1}, []int{2,-1}, []int{-2,-1},
}
for _,move := range steps {
if x+move[0] >=1 && x+move[0] <= 8 && y+move[1] >=1 && y+move[1] <=8 {
count++
}
}
fmt.Println(count)
}
// 게임개발
// 1. 현재방향 왼쪽방향 부터 차례로 갈곳 정함
// 2. 왼쪽 회전 후 안 가본칸이면 전진, 방문한 칸이라면 왼쪽 회전만
// 3. 네칸 모두 가본칸이거나 바다라면, 방향 유지한채 한칸 뒤로 (뒤가 바다이면 움직임 멈춤)
// 0 북 1 동 2 남 3 서
// 0 육지 1 바다
// N x M 맵
// 캐릭터가 방문한 칸의 수 출력
// 4 4
// 1 1 0 // (1,1)에 북쪽 0을 바라보고 서 있는 캐릭터
// 1 1 1 1
// 1 0 0 1
// 1 1 0 1
// 1 1 1 1
// 3
// TODO 뒤로 돌아가는 케이스에서 일부 오류 있음
// 모든 칸을 다 방문하지 않는 예외케이스 발생 (expected: 6, actual: 5)
// 5 5
// 1 1 0
// 1 1 1 1 1
// 1 0 0 0 1
// 1 1 0 0 1
// 1 1 0 1 1
// 1 1 1 1 1
// 5
package main
import (
"fmt"
)
func main() {
var N,M int
var r,c, d int
fmt.Scanln(&N, &M)
fmt.Scanln(&r, &c, &d)
area := make([][]int, N)
for r:=0; r< N; r++ {
temp := make([]int, M)
for c:=0; c< M; c++ {
fmt.Scan(&temp[c])
}
area[r] = temp
}
dr := []int{-1,0,1,0}
dc := []int{0,1,0,-1}
count := 1
for {
allFour := false
for i:=0; i<4; i++ {
area[r][c] = 2
dd := ((d-1) +4) %4
d = dd
isRange := r+ dr[dd] >=0 && r+dr[dd] <N && c+ dc[dd] >=0 && c+dc[dd] <M
if isRange && area[r + dr[dd]][c + dc[dd]] == 0 {
r = r + dr[dd]
c = c + dc[dd]
count++
// fmt.Println("움직인후", r,c,count, d)
break
}
if i==3 {
allFour = true
}
}
if allFour {
newr := r + dr[(d+2) % 4]
newc := c + dc[(d+2) % 4]
if area[newr][newc] != 1 {
r = newr
c = newc
} else {
break
}
}
}
fmt.Println(count)
}
// 스택구현
package main
import (
"fmt"
"sort"
)
func main() {
stack := []int{}
stack = append(stack, 5)
stack = append(stack, 2)
stack = append(stack, 3)
stack = append(stack, 7)
stack = stack[:len(stack)-1]
stack = append(stack, 1)
stack = append(stack, 4)
stack = stack[:len(stack)-1]
// 5 2 3 1
fmt.Println(stack)
sort.Sort(sort.IntSlice(stack))
fmt.Println(stack)
sort.Sort(sort.Reverse(sort.IntSlice(stack)))
fmt.Println(stack)
}
// 큐구현
package main
import (
"fmt"
"sort"
)
func main() {
queue := []int{}
queue = append(queue, 5)
queue = append(queue, 2)
queue = append(queue, 3)
queue = append(queue, 7)
queue = queue[1:]
queue = append(queue, 1)
queue = append(queue, 4)
queue = queue[1:]
// 3 7 1 4
fmt.Println(queue)
sort.Sort(sort.IntSlice(queue))
fmt.Println(queue)
sort.Sort(sort.Reverse(sort.IntSlice(queue)))
fmt.Println(queue)
}
package main
import (
"fmt"
)
func factorial(n int) int {
if n <= 1{
return 1
}
return n * factorial(n-1)
}
func main() {
fmt.Println(factorial(5))
}
메모리 | 속도 | |
---|---|---|
인접 행렬 | 노드간 모든관계를 저장하므로, 노드많을 수록 불필요하게 메모리 증가 | |
인접 리스트 | 연결된 정보만 저장하므로 효율적 메모리 사용 | 두 노드 연결여부 확인 속도는 느림 |
// 1-(7)-0-(5)-2
package main
import (
"fmt"
)
type pair struct {
node int
distance int
}
func main() {
// 인접 행렬
// 0 1 2
// 0 0 7 5
// 1 7 0 INF
// 2 5 INF 0
INF := 999999999
graph_matrix := [][]int {
{0, 7, 5},
{7, 0, INF},
{5, INF, 0},
}
fmt.Println(graph_matrix)
// 인접 리스트
// 0 -> 1(7) -> 2(5)
// 1 -> 0(7)
// 2 -> 0(5)
graph_list := make([][]pair, 3)
graph_list[0] = make([]pair, 0)
graph_list[0] = append(graph_list[0], pair{1,7})
graph_list[0] = append(graph_list[0], pair{2,5})
graph_list[1] = make([]pair, 0)
graph_list[1] = append(graph_list[1], pair{0,7})
graph_list[2] = make([]pair, 0)
graph_list[2] = append(graph_list[2], pair{0,5})
fmt.Println(graph_list)
}
// DFS 메소드 (인접리스트- 2차원리스트 활용)
// 인접행렬 방식으로 노드 1,2,..., 8 표현
// graph[0]은 없으므로 empty리스트 []
// graph[1] ~ graph[8] 표현
package main
import (
"fmt"
)
func dfs(graph [][]int, v int, visited []bool) {
// 현재노드 방문처리
visited[v] = true
fmt.Print(v, " ")
// 현재노드와 연결된 다른 노드를 Recursive 방문
for _,i := range graph[v] {
if !visited[i] {
dfs(graph, i, visited)
}
}
}
func main() {
graph := [][]int {
{},
{2,3,8},
{1,7},
{1,4,5},
{3,5},
{3,4},
{7},
{2,6,8},
{1,7},
}
visited := []bool {false,false,false,false,false,false,false,false,false}
// 1 2 7 6 8 3 4 5
dfs(graph, 1, visited)
fmt.Println()
}
// 인접행렬 방식으로 노드 1,2,..., 8 표현
// graph[0]은 없으므로 empty리스트 []
// graph[1] ~ graph[8] 표현
package main
import (
"fmt"
)
func bfs(graph [][]int, start int, visited []bool) {
// 큐 구현을 위한
queue := []int{start}
// 현재노드 방문처리
visited[start] = true
for len(queue) > 0 {
// 큐에서 원소 하나 Pop하여 출력
v := queue[0]
queue = queue[1:]
fmt.Print(v, " ")
for _, i := range graph[v] {
if !visited[i] {
queue = append(queue, i)
visited[i] = true
}
}
}
}
func main() {
graph := [][]int {
{},
{2,3,8},
{1,7},
{1,4,5},
{3,5},
{3,4},
{7},
{2,6,8},
{1,7},
}
visited := []bool {false,false,false,false,false,false,false,false,false}
// 1 2 3 8 7 4 5 6
bfs(graph, 1, visited)
fmt.Println()
}
DFS | BFS | |
---|---|---|
동작원리 | 스택 | 큐 |
구현방법 | 재귀함수 이용 | 큐 자료구조 |
// NxM 얼음틀
// 0: 얼음 1: 틀
// 생성되는 아이스크림 수 (0으로 연결된 조각)
package main
import (
"fmt"
"strconv"
)
func dfs(graph [][]int, i,j int) bool {
N := len(graph)
M := len(graph[0])
if i < 0 || i>=N || j <0 || j>=M {
return false
}
if graph[i][j] == 0 {
graph[i][j] = 1
dfs(graph, i+1, j)
dfs(graph, i-1, j)
dfs(graph, i, j+1)
dfs(graph, i, j-1)
return true
}
return false
}
func main() {
var N,M int
fmt.Scan(&N, &M)
graph := make([][]int, N)
var line string
for i:=0; i<N; i++ {
graph[i] = make([]int, M)
fmt.Scanln(&line)
for j:=0; j < M; j++ {
n,_ := strconv.Atoi(string(line[j]))
graph[i][j] = n
}
}
result := 0
for i:=0; i<N; i++ {
for j:=0; j < M; j++ {
if dfs(graph, i,j) {
result++
}
}
}
fmt.Println(result)
}
// NxM 미로
// (1,1) -> NxM 최단경로로 괴물을 피해서 갈때 움직인 칸의 수
// 0: 괴물 1:괴물없는 부분
package main
import (
"fmt"
"strconv"
)
type coord struct {
r int
c int
}
func bfs(graph [][]int) int {
N := len(graph)
M := len(graph[0])
dr := []int{-1,0,1,0}
dc := []int{0,-1,0,1}
var nr,nc int
r, c := 0,0
queue := make([]coord, 0)
queue = append(queue, coord{r,c})
for len(queue) > 0 {
r = queue[0].r
c = queue[0].c
queue = queue[1:]
for i:=0; i<4; i++ {
nr = r + dr[i]
nc = c + dc[i]
if nr < 0 || nr >=N || nc < 0 || nc >=M {
continue
}
if graph[nr][nc] == 0 {
continue
}
if graph[nr][nc] == 1 {
graph[nr][nc] = graph[r][c] + 1
queue = append(queue, coord{r: nr, c: nc})
}
}
}
return graph[N-1][M-1]
}
func main() {
var N, M int
fmt.Scan(&N, &M)
graph := make([][]int, N)
var line string
for i:=0; i<N; i++ {
graph[i] = make([]int, M)
fmt.Scanln(&line)
for j:=0; j<M; j++ {
n,_ := strconv.Atoi(string(line[j]))
graph[i][j] = n
}
}
fmt.Println(bfs(graph))
}
package main
import (
"fmt"
)
// O(N^2)
func selection_sort(arr []int) []int {
var min_idx int
for i:=0; i<len(arr); i++ {
min_idx = i
for j:=i+1; j<len(arr); j++ {
if arr[min_idx] > arr[j] {
min_idx = j
}
}
arr[min_idx], arr[i] = arr[i], arr[min_idx]
}
return arr
}
// O(N^2)
func insert_sort(arr []int) []int {
for i := 0; i<len(arr); i++ {
for j := i; j>=1; j-- {
if arr[j] < arr[j-1] {
arr[j], arr[j-1] = arr[j-1], arr[j]
}
}
}
return arr
}
// O(NlogN)
func quick_sort(arr []int, start, end int) {
if start >=end {
return
}
pivot := start
left := start+1
right := end
for left <= right {
for left <= end && arr[left] <= arr[pivot] {
left++
}
for right > start && arr[right] > arr[pivot] {
right--
}
if right > left {
arr[left], arr[right] = arr[right], arr[left]
} else {
// 엇갈림 -> for-loop exit
arr[right], arr[pivot] = arr[pivot], arr[right]
}
}
quick_sort(arr, start, right-1)
quick_sort(arr, right+1, end)
}
func getMinMax(arr []int) (int,int) {
min := arr[0]
max := arr[0]
for _,v := range arr {
if v < min {
min = v
}
if v > max {
max = v
}
}
return min,max
}
// O(N+K)
// N: 데이터수 K: 최대값
func counting_sort(arr []int) []int{
min, max := getMinMax(arr)
countArr := make([]int, max-min+1)
for _,v := range arr {
countArr[v] += 1
}
sortedArr := make([]int, 0)
for i,v := range countArr {
for j:=0; j<v; j++ {
sortedArr = append(sortedArr, i)
}
}
return sortedArr
}
func main() {
arr := []int {7,5,9,0,3,1,6,2,4,8}
fmt.Println(selection_sort(arr))
arr = []int {7,5,9,0,3,1,6,2,4,8}
fmt.Println(insert_sort(arr))
arr = []int {7,5,9,0,3,1,6,2,4,8}
quick_sort(arr, 0, len(arr)-1)
fmt.Println(arr)
arr = []int {7,5,9,0,3,1,6,2,9,1,4,8,0,5,2}
fmt.Println(counting_sort(arr))
}
/** Go언어 제공 sort 패키지 활용! */
package main
import (
"fmt"
"sort"
)
type Student struct {
Name string
Age int
Score int
}
type Students []Student
// 구조체 정렬 시 필요한 정의 메소드
// Len(), Less(), Swap()
func (s Students) Len() int {
return len(s)
}
func (s Students) Less(i, j int) bool {
// return s[i].Name < s[j].Name
// return s[i].Age < s[j].Age
return s[i].Score < s[j].Score
}
func (s Students) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func main() {
slice := []Student {
{"B", 19, 90},
{"C", 25, 97},
{"A", 8, 55},
{"D", 42, 30},
}
// 1. 구조체 정렬
sort.Sort(Students(slice))
fmt.Println(slice)
// 2-1. int 정렬
arr := []int {7,5,9,0,3,1,6,2,4,8}
sort.Ints(arr)
fmt.Println(arr)
// 2-2. IntSlice 인터페이스 정렬
arr = []int {7,5,9,0,3,1,6,2,4,8}
sort.IntSlice(arr).Sort()
fmt.Println(arr)
// 3-1. float64 정렬
floatArr := []float64 {7.12,5.1,9,0,3.14,1,6,2,4,8.99}
sort.Float64s(floatArr)
fmt.Println(floatArr)
// 3-2. float64 인터페이스 정렬
floatArr = []float64 {7.12,5.1,9,0,3.14,1,6,2,4,8.99}
sort.Float64Slice(floatArr).Sort()
fmt.Println(floatArr)
// 4-1. string 정렬
strArr := []string {"c", "a", "d", "e", "b"}
sort.Strings(strArr)
fmt.Println(strArr)
// 4-2. StringSlice 인터페이스 정렬
strArr = []string {"c", "a", "d", "e", "b"}
sort.StringSlice(strArr).Sort()
fmt.Println(strArr)
}
package main
import (
"fmt"
"sort"
)
// reverse
func quick_sort(arr []int, start, end int) {
if start >= end {
return
}
pivot := start
left := start+1
right := end
for left <= right {
for left <= end && arr[left] >= arr[pivot] {
left++
}
for right > start && arr[right] <= arr[pivot] {
right--
}
if left > right {
arr[pivot], arr[right] = arr[right], arr[pivot]
} else {
arr[left], arr[right] = arr[right], arr[left]
}
}
quick_sort(arr, start, right-1)
quick_sort(arr, right+1, end)
}
func main() {
var N int
fmt.Scanln(&N)
arr := make([]int, N)
for i:=0; i< len(arr); i++ {
fmt.Scanln(&arr[i])
}
//quick_sort(arr, 0, len(arr)-1)
sort.Sort(sort.Reverse(sort.IntSlice(arr)))
fmt.Println(arr)
}
package main
import (
"fmt"
"sort"
)
type Student struct {
Name string
Score int
}
type Students []Student
func (s Students) Len() int{
return len(s)
}
func (s Students) Less(i, j int) bool {
return s[i].Score < s[j].Score
}
func (s Students) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func main() {
var N int
fmt.Scanln(&N)
students := make([]Student, 0)
var name string
var score int
for i:=0; i< N; i++ {
fmt.Scan(&name, &score)
students = append(students, Student{Name: name, Score: score})
}
sort.Sort(Students(students))
for _,s := range students {
fmt.Print(s.Name, " ")
}
fmt.Println()
sort.Sort(sort.Reverse(Students(students)))
for _,s := range students {
fmt.Print(s.Name, " ")
}
fmt.Println()
}
// sort2. 위에서 아래로
package main
import (
"fmt"
"sort"
)
func quick_sort(arr []int, start, end int) {
if start >= end {
return
}
pivot := start
left := start+1
right := end
for left <= right {
for left <= end && arr[left] < arr[pivot] {
left++
}
for right > start && arr[right] >= arr[pivot] {
right--
}
if left > right {
arr[right], arr[pivot] = arr[pivot], arr[right]
} else {
arr[left], arr[right] = arr[right], arr[left]
}
}
quick_sort(arr, start, right-1)
quick_sort(arr, right+1, end)
}
func main() {
var N,K int
fmt.Scan(&N, &K)
arr1 := make([]int, N)
arr2 := make([]int, N)
for i:=0; i<N; i++ {
fmt.Scan(&arr1[i])
}
for i:=0; i<N; i++ {
fmt.Scan(&arr2[i])
}
sort.Sort(sort.IntSlice(arr1))
sort.Sort(sort.IntSlice(arr2))
for i:=0; i<K; i++ {
if arr1[i] < arr2[N-i-1] {
arr1[i], arr2[N-i-1] = arr2[N-i-1], arr1[i]
}
}
sum:=0
for i:=0; i<N; i++ {
sum += arr1[i]
}
fmt.Println(sum)
}
// 5 Dongbin
// A B C Dongbin E
// 3
package main
import (
"fmt"
)
func sequential_search(target string, arr []string) int {
for i:=0; i<len(arr); i++ {
if arr[i] == target {
return i + 1
}
}
return -1
}
func main() {
var N int // 리스트 개수
var target string // 찾는 이름
fmt.Scan(&N, &target)
arr := make([]string, N)
for i:=0; i<N; i++ {
fmt.Scan(&arr[i])
}
fmt.Println(sequential_search(target, arr))
}
// 10 7
// 1 3 5 7 9 11 13 15 17 19
// 4
package main
import (
"fmt"
)
func binary_search(arr []int, target, start, end int) int {
if start > end {
return -1
}
if len(arr) < 1 {
return -1
}
mid := (start+end) / 2
if arr[mid] == target {
return mid
} else if arr[mid] > target {
return binary_search(arr, target, start, mid-1)
} else {
return binary_search(arr, target, mid+1, end)
}
}
func main() {
var N int // 리스트 개수
var target int // 찾는 숫자
fmt.Scan(&N, &target)
arr := make([]int, N)
for i:=0; i<N; i++ {
fmt.Scan(&arr[i])
}
result := binary_search(arr, target, 0, len(arr)-1)
if result == -1 {
fmt.Println("NOT FOUND!")
} else {
fmt.Println(result + 1)
}
}
// 10 7
// 1 3 5 7 9 11 13 15 17 19
// 4
package main
import (
"fmt"
)
func binary_search(arr []int, target, start, end int) int {
if start > end || len(arr) < 1 {
return -1
}
var mid int
for start <= end {
mid = (start + end) / 2
if arr[mid] == target {
return mid
} else if arr[mid] > target {
end = mid-1
} else {
start = mid+1
}
}
return -1
}
func main() {
var N int
var target int
fmt.Scan(&N, &target)
arr := make([]int, N)
for i:=0; i<N; i++ {
fmt.Scan(&arr[i])
}
result := binary_search(arr, target, 0, len(arr)-1)
if result == -1 {
fmt.Println("NOT FOUND!")
} else {
fmt.Println(result + 1)
}
}
Such tree can be represented by a linked data structure in which each node is an object.
Each node contains 'key' with satellite data, 'left' and 'right' child nodes, and 'parent' node.
The root node is the only node in the tree whose parent is NIL.
The keys in a binary search tree are always stored in such a way as to satisfy the binary-search-tree property:
x: node in a BST
if y is in the left subtree of x, then y.key <= x.key
if y is in the right subtree of x, then y.key >= x.key
// 1-1. Slice(List)이용
// 5
// 8 3 7 9 2
// 3
// 5 7 9
// no yes yes
package main
import (
"fmt"
)
func binary_search(arr []int, target, start, end int) int {
if start > end || len(arr) < 1 {
return -1
}
mid := (start+end) / 2
if arr[mid] == target {
return mid
} else if arr[mid] > target {
return binary_search(arr, target, start, mid-1)
} else {
return binary_search(arr, target, mid+1, end)
}
}
func main() {
var N,M int
fmt.Scanln(&N)
arr1 := make([]int, N)
for i:=0; i<N; i++ {
fmt.Scanf("%d", &arr1[i])
}
fmt.Scanln(&M)
arr2 := make([]int, M)
for i:=0; i<M; i++ {
fmt.Scanf("%d", &arr2[i])
}
var result int
for i:=0; i<M; i++ {
result = binary_search(arr1, arr2[i], 0, len(arr1)-1)
if result != -1 {
fmt.Print("yes ")
} else{
fmt.Print("no ")
}
}
fmt.Println()
}
// 2.Map(set과 비슷한 원리)활용
// 부품찾기-Map이용 (set과 비슷한 원리)
// 5
// 8 3 7 9 2
// 3
// 5 7 9
// no yes yes
package main
import (
"fmt"
)
func main() {
var N,M int
fmt.Scanln(&N)
// 맵에 첫번째 부품리스트 저장
var key int
map1 := make(map[int]int)
for i:=0; i<N; i++ {
fmt.Scanf("%d", &key)
map1[key] = 1
}
// 요청 부품리스트 입력과 동시에 Map 포함여부
// -> result에 저장 (yes/no)
fmt.Scanln(&M)
result := make([]string, M)
for i:=0; i<M; i++ {
fmt.Scanf("%d", &key)
if map1[key] == 1 {
result[i]= "yes"
} else {
result[i]= "no"
}
}
fmt.Println(result)
}
// 1.떡볶이 떡 만들기 - 순차탐색
// 4 6
// 19 15 10 17
// 15
package main
import (
"fmt"
)
func getMax(arr []int) int {
max :=arr[0]
for i:=0; i<len(arr); i++ {
if arr[i] > max {
max = arr[i]
}
}
return max
}
func getDduck(arr []int, cutter int) int {
result := 0
for i:=0; i<len(arr); i++ {
if arr[i] > cutter {
result += arr[i]-cutter
}
}
return result
}
func main() {
var N,M int
fmt.Scan(&N, &M)
arr := make([]int, N)
for i:=0; i<N; i++ {
fmt.Scanf("%d", &arr[i])
}
max := getMax(arr)
for i:= 0; i <=max; i++ {
if getDduck(arr, i) == M {
fmt.Println(i)
break
}
}
}
// 2.떡볶이 떡 만들기 - 이진탐색
// 4 6
// 19 15 10 17
// 15
package main
import (
"fmt"
)
func getMax(arr []int) int {
max :=arr[0]
for i:=0; i<len(arr); i++ {
if arr[i] > max {
max = arr[i]
}
}
return max
}
func getDduck(arr []int, cutter int) int {
result := 0
for i:=0; i<len(arr); i++ {
if arr[i] > cutter {
result += arr[i]-cutter
}
}
return result
}
func main() {
var N,M int
fmt.Scan(&N, &M)
arr := make([]int, N)
for i:=0; i<N; i++ {
fmt.Scanf("%d", &arr[i])
}
max := getMax(arr)
left, right := 0, max
var mid, sum int
for left <=right {
mid = (left+right) / 2
sum = getDduck(arr,mid)
if sum == M {
fmt.Println(mid)
break
} else if sum > M {
left = mid+1
} else {
right = mid-1
}
}
}
a_n+2 = f(a_n+1, a_n) = a_n+1 + a_n where a_1=a_2=1
// 피보나치수가 클수록 기하급수적 증가
// n=100이면 2^100 : 연산불가능
package main
import (
"fmt"
)
func fibo(n int) int {
if n==1 || n == 2 {
return 1
}
return fibo(n-1) + fibo(n-2)
}
func main() {
fmt.Println(fibo(4))
}
// Memoization 기법 -> 피보나치수열 보완
// Top-Down
package main
import (
"fmt"
)
var arr []int
func init() {
arr = make([]int, 100)
}
func fibo(n int) int {
if n==1 || n == 2 {
return 1
}
if arr[n] != 0 {
return arr[n]
}
arr[n] = fibo(n-1) + fibo(n-2)
return arr[n]
}
func main() {
fmt.Println(fibo(90))
}
package main
import (
"fmt"
)
var arr []int
func init() {
arr = make([]int, 30001)
}
func min(i,j int) int {
if i< j {
return i
} else {
return j
}
}
func main() {
var N int
fmt.Scanln(&N)
for i := 2; i< N+1; i++ {
arr[i] = arr[i-1] + 1
if i%2 == 0 {
arr[i] = min(arr[i], arr[i /2] + 1)
} else if i% 3 == 0 {
arr[i] = min(arr[i], arr[i /3] + 1)
} else if i% 5 == 0 {
arr[i] = min(arr[i], arr[i /5] + 1)
}
}
fmt.Println(arr[N])
}
package main
import (
"fmt"
)
var d []int
func initD(N int){
d = make([]int, N)
}
func max(i,j int ) int {
if i>j {
return i
} else {
return j
}
}
func main() {
var N int
fmt.Scanln(&N)
initD(N)
arr := make([]int, N)
for i:=0; i<N; i++ {
fmt.Scanf("%d", &arr[i])
}
d[0] = arr[0]
d[1] = max(arr[0], arr[1])
for i:=2; i< len(d); i++ {
d[i] = max(d[i-1], d[i-2] + arr[i])
}
fmt.Println(d[N-1])
}
그리디 알고리즘과 다이나믹 프로그래밍 알고리즘이 그대로 적용되는 특징