1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | // maximumPathSum package main import ( "bufio" "bytes" "fmt" "os" ) func main() { readData := OpenFileAndRead() fmt.Println("ReadByteStream :", readData) CalcMaximumPath(readData) } func CalcMaximumPath(data []byte) { numberTree := CreateNumberTree(data) treeLevel := len(numberTree) fmt.Println("계산전 : ", numberTree, treeLevel) for idx := treeLevel; idx > 1; idx-- { numArrUp, _ := numberTree[idx-1] numArrDown, _ := numberTree[idx] arrLength := len(numArrDown) // 마지막 원소는 제외한다. for idx := 0; idx < arrLength-1; idx++ { if numArrDown[idx] > numArrDown[idx+1] { numArrUp[idx] += numArrDown[idx] } else { numArrUp[idx] += numArrDown[idx+1] } } //필요없는 데이터는 삭제한다. delete(numberTree, idx) } fmt.Println("계산후 : ", numberTree) } func CreateNumberTree(data []byte) map[int][]int { var numberTree map[int][]int = make(map[int][]int) var treeLevel int = 1 reader := bufio.NewReader(bytes.NewReader(data)) var lineData []byte var lineReadErr error for ; lineReadErr == nil; lineData, _, lineReadErr = reader.ReadLine() { if lineData != nil { numberTree[treeLevel] = GetRowDatas(lineData) treeLevel++ } } return numberTree } func GetRowDatas(data []byte) []int { var intArr []int var dataSize = len(data) var startPos int = 0 for idx, _ := range data { if data[idx] == 32 { intArr = append(intArr, BytesToInt(data, startPos, idx-1)) startPos = idx + 1 } } intArr = append(intArr, BytesToInt(data, startPos, dataSize-1)) return intArr } func BytesToInt(data []byte, startPos int, readPos int) int { var sum int var pow int = 1 for i := readPos; i >= startPos; i-- { sum += pow * int(data[i]-'0') pow *= 10 } return sum } func OpenFileAndRead() []byte { file, openErr := os.Open("data.txt") var data []byte if openErr != nil { fmt.Println(openErr) } else { fileInfo, statErr := file.Stat() if statErr != nil { fmt.Println(statErr) } else { data = make([]byte, fileInfo.Size()) file.Read(data) } } return data } |
2019년 4월 13일 토요일
# 주어진 데이터에서 최대값을 지니는 경로 구하기 with Golang
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기