ぱりーにの技術系ブログ

調べたことまとめ

LeetCode始めました+解いてみました(13. Roman to Integer)

こんにちは!ぱりーにです。

ブログを開設してみました。
自分が作業したり学んだりしたことのメモとして活用していきます。

今日はLeetCodeの問題1問解きました。
問題名は「13. Roman to Integer」で、ローマ数字を整数に変換する関数を作成します。

自分の解法

実際に作成したスクリプトは以下になります。

package main

import (
    "fmt"
)

func romanToInt(s string) int {
    romans := map[string]int{
        "I": 1,
        "V": 5,
        "X": 10,
        "L": 50,
        "C": 100,
        "D": 500,
        "M": 1000,
    }
    sum := 0
    for i, c := range s {
        ss := string(c)
        var next byte
        if i < len(s)-1 {
            next = s[i+1]
        }
        fmt.Println("next: ", next)
        if ss == "I" {
            if string(next) == "V" || string(next) == "X" {
                sum -= romans[ss]
            } else {
                sum += romans[ss]
            }
        } else if ss == "X" {
            if string(next) == "L" || string(next) == "C" {
                sum -= romans[ss]
            } else {
                sum += romans[ss]
            }
        } else if ss == "C" {
            if string(next) == "D" || string(next) == "M" {
                sum -= romans[ss]
            } else {
                sum += romans[ss]
            }
        } else {
            sum += romans[ss]
        }
    }
    return sum
}

func main() {
    fmt.Println(romanToInt("MCMXCIV"))

}

考え方としては、特定のローマ数字が特定の文字列の前に来たときに符号をプラスからマイナスに変えることによって数字を表現していると解釈してそれを式に変換しています。

具体的な手順としては

  • ローマ数字に対応する整数をmapで作成
  • inputのローマ数字をfor分で1文字ずつ取り出す
  • 符号が反転する可能性のあるローマ数字「I,X,C」について、反転条件となるローマ数字が1文字後にあったときに符号を反転してから加算する
  • 反転しない場合はそのまま加算する
  • 合計値をreturn

上記の仕組みで無事通りました!

ほかの解法

答えを見たところ、inputの文字列を調べて「IV」などのローマ数字を発見したときに「IIII」に変換してそのまま数値を加算していく方法で求めているものがありました。
分かりやすい・・・!

まとめ

とりあえず1問無事自力で解けて、解法を見て勉強になりました。
golangはとても手になじむのでこの調子で触っていきたいと思います。