From 79b53cd52130796e8985fc97d2f71d177b9d081b Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 15 Oct 2024 10:44:23 +0900 Subject: [PATCH 1/2] pullrequests/roman_to_integer --- pullrequests/roman_to_integer/step1.go | 42 ++++++++++++++++++++++++++ pullrequests/roman_to_integer/step2.go | 33 ++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 pullrequests/roman_to_integer/step1.go create mode 100644 pullrequests/roman_to_integer/step2.go diff --git a/pullrequests/roman_to_integer/step1.go b/pullrequests/roman_to_integer/step1.go new file mode 100644 index 0000000..a2a8aa8 --- /dev/null +++ b/pullrequests/roman_to_integer/step1.go @@ -0,0 +1,42 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +時間:25分 +方針自体はすぐに思いついたが、単純に実装に時間がかかってしまった。 +*/ +func romanToIntStep1(s string) int { + symbolToInt := map[rune]int{ + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000, + } + total := 0 + runeS := []rune(s) + currIndex, nextIndex := 0, 1 + for currIndex < len(runeS) && nextIndex < len(runeS) { + curr, next := runeS[currIndex], runeS[nextIndex] + if (curr == 'I' && (next == 'V' || next == 'X')) || + (curr == 'X' && (next == 'L' || next == 'C')) || + (curr == 'C' && (next == 'D' || next == 'M')) { + total += symbolToInt[next] - symbolToInt[curr] + currIndex, nextIndex = currIndex+2, nextIndex+2 + continue + } + total += symbolToInt[curr] + currIndex, nextIndex = currIndex+1, nextIndex+1 + } + if currIndex < len(runeS) { + total += symbolToInt[runeS[currIndex]] + } + return total +} diff --git a/pullrequests/roman_to_integer/step2.go b/pullrequests/roman_to_integer/step2.go new file mode 100644 index 0000000..9063f83 --- /dev/null +++ b/pullrequests/roman_to_integer/step2.go @@ -0,0 +1,33 @@ +//lint:file-ignore U1000 Ignore all unused code +package template + +/* +レビュワーの方へ: + - このコードは既にGoの標準のフォーマッタで整形済みです。演算子の周りにスペースがあったりなかったりしますが、これはGoのフォーマッタによるもので、優先順位の高い演算子の周りにはスペースが入らず、低い演算子の周りには入るようになっています。https://qiita.com/tchssk/items/77030b4271cd192d0347 +*/ + +/* +前のシンボルの方が後ろのシンボルよりも小さい場合として考えることができる。 +ただ個人的にはStep1の方が要件に明確に沿っているので良いのではと思っている。 +*/ +func romanToIntStep2(s string) int { + symbolToInt := map[rune]int{ + 'I': 1, + 'V': 5, + 'X': 10, + 'L': 50, + 'C': 100, + 'D': 500, + 'M': 1000, + } + total := 0 + runeS := []rune(s) + for i, r := range runeS { + if i+1 < len(runeS) && symbolToInt[r] < symbolToInt[runeS[i+1]] { + total -= symbolToInt[r] + } else { + total += symbolToInt[r] + } + } + return total +} From dc07f266d7b5f513fb9586712548120de9f20050 Mon Sep 17 00:00:00 2001 From: rihib Date: Tue, 15 Oct 2024 10:45:55 +0900 Subject: [PATCH 2/2] fix --- pullrequests/roman_to_integer/step1.go | 2 +- pullrequests/roman_to_integer/step2.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pullrequests/roman_to_integer/step1.go b/pullrequests/roman_to_integer/step1.go index a2a8aa8..4bfbfc4 100644 --- a/pullrequests/roman_to_integer/step1.go +++ b/pullrequests/roman_to_integer/step1.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package template +package romantointeger /* レビュワーの方へ: diff --git a/pullrequests/roman_to_integer/step2.go b/pullrequests/roman_to_integer/step2.go index 9063f83..1634c56 100644 --- a/pullrequests/roman_to_integer/step2.go +++ b/pullrequests/roman_to_integer/step2.go @@ -1,5 +1,5 @@ //lint:file-ignore U1000 Ignore all unused code -package template +package romantointeger /* レビュワーの方へ: