2019년 4월 13일 토요일

# 주어진 데이터에서 최대값을 지니는 경로 구하기 with Golang

  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
}

댓글 없음:

댓글 쓰기