티스토리 뷰

package main

import (
    "fmt"
    "log"
    "math"
)

func stringValues() []string {
    return []string {"일", "이", "삼", "사", "오", "육", "칠", "팔", "구"}
}

func unitValue(inner bool) ([]string, float64) {
    if inner {
        return []string{"십", "백", "천"}, 10
    } else {
        return []string{"만", "억", "조"}, 10000
    }
}

func main() {
    data := [][]string{
        {"오백삼십조칠천팔백구십만천오백삼십구", "삼조사천이만삼천구"},
    }

    for _, element := range data {
        result := solution2(element[0], element[1])
        if result != "오백삼십삼조일억천팔백구십이만사천오백사십팔" {
            log.Fatal("result is not 오백삼십삼조일억천팔백구십이만사천오백사십팔 ", result)
        }

        fmt.Println(result)
    }
}

func solution2(str1 string, str2 string) string {
    number1 := stringToNumber(str1, false)
    number2 := stringToNumber(str2, false)
    sum := number1 + number2
    result := numberToString(sum, false)
    return result
}

func findString(array []string, text string) (int, bool) {
    for i, n := range array {
        if text == n {
            return i, true
        }
    }

    return -1, false
}

func stringToNumber(str string, inner bool) int64 {
    var unitValues, unit = unitValue(inner)
    var stringValues = stringValues()

    var subString = ""
    var keepNumber int64 = 1
    var result int64 = 0

    for _, r := range str {
        element := string(r)

        if inner {
            index, exist := findString(stringValues, element)
            if exist {
                keepNumber = int64(index + 1)
            }

            index, exist = findString(unitValues, element)
            if exist {
                pow := math.Pow(unit, float64(index + 1))
                result += keepNumber * int64(pow)
                keepNumber = 0
            }
        } else {
            index, exist := findString(unitValues, element)
            if exist {
            number := stringToNumber(subString, true)
                pow := math.Pow(unit, float64(index + 1))
                result += number * int64(pow)
                subString = ""
            } else {
                subString += element
            }
        }
    }

    if !inner {
        number := stringToNumber(subString, true)
        result += number
    } else {
        result += keepNumber
    }

    return result
}

func numberToString(number int64, inner bool) string {
    var unitValues, unit = unitValue(inner)
    var stringValues = stringValues()

    var overStep = -1
    var remain = number
    var result = ""

    for {
        next := remain / int64(unit) * int64(unit)
        number := remain - next

        if number != 0 {
            var str string
            if inner {
                if number > 1 {
                    str = stringValues[int(number - 1)]
                } else {
                    str = ""
                }
            } else {
                if number < 10 {
                    str = stringValues[int(number - 1)]
                } else {
                    str = numberToString(number, true)
                }
            }

            if overStep != -1 {
                str += unitValues[overStep]
            }

            result = str + result
        }

        overStep++

        remain = remain / int64(unit)
        if remain == 0 {
            break
        }
    }

    return result
}

'Coding' 카테고리의 다른 글

Go. BinarySearch  (0) 2020.08.08
Go. 연속된 부분합 구하기  (0) 2020.08.02
Go. Int64를 벗어나는 스트링 숫자 더하기  (0) 2020.07.04
이진트리의 순회.  (0) 2020.07.01
배열에서 가장 큰 정사각형 찾기  (0) 2019.12.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함