質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

2回答

446閲覧

05/22 AtCoderBeginnerContestのB問題について。

Jonathan_Sf

総合スコア13

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2021/05/22 15:05

編集2021/05/22 15:08

お世話になります。

Go言語初心者です。

昨日のAtCoderBeginnerContestのB問題について下記のように回答したのですが、うまくいきません。
問題はこちらをご覧ください。方針としては

1、reverseで配列を逆順にする。
2、changeで配列の中身を変更する(9を6、6を9に)
3、joinで配列の中身を文字列として結合する。

1はできているのですが2、3が効いていません。実行すると出力は[9 8 8 1 0 6 0]になります。ご教示いただけますと幸いです。
ご参考
https://play.golang.org/p/m94BuEIuLpG

main.go

1package main 2 3import ( 4 "fmt" 5 "strings" 6) 7 8func main() { 9 var a string = "0601889" 10 var ans string 11 //fmt.Scan(&a) 12 str := strings.Split(a, "") 13 reverse(str) 14 change(str) 15 join(str, ans) 16 fmt.Println(str) 17 fmt.Println(ans) 18 19} 20 21func reverse(a []string) { 22 for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 { 23 a[i], a[j] = a[j], a[i] 24 } 25} 26 27func change(st []string) { 28 for _, value := range st { 29 if value == "6" { 30 value = "9" 31 } 32 if value == "9" { 33 value = "6" 34 } 35 } 36} 37 38func join(str []string, ans string) { 39 for _, v := range str { 40 ans += v 41 } 42} 43

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

change, join 関数いずれも、処理結果を返していません。

change 関数では value に値を入れていますが、これでは st は書き換わりません。
st を書き換える必要があります。

join 関数では ans に文字を追加していますが、呼び元の ans が書き換わるわけではありません。
作成した文字列を return して呼び元で受け取るようにしてみましょう。

AtCoder に挑戦されているとのことで修正コードを示すのは避けます。
頑張ってください!

投稿2021/05/22 15:57

yh1224

総合スコア653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jonathan_Sf

2021/05/23 04:38

ありがとうございます。ご指摘通り修正したところ、解決できました。
guest

0

ベストアンサー

change関数でも reverse関数と同様に配列の内容を操作する必要があります。
for文で確保した一時変数 valueの内容を変更しただけでは配列本体の値は変更されません。
reverse関数で行ったことと同様に配列の中身を変更するように書き換えましょう。

join関数については、定時のコードの様に引数にansを渡すのであれば、ansはポインタで渡し、join関数でもしかるべき形で記載しなければいけません。
そんな書き方は初心者には全く向かないので、strを引数に取り文字列を結合した結果をstringで返す関数に作り替える必要があるでしょう。
すぐにピンとこなければ、関数の作成方法の一番最初に立ち返って復習してください。

この2つが正しくできてもACは取れません。TLE(時間切れ)になります。
なぜ時間切れになるのか、どの処理に時間がかかっているのか、考えるのが次のステップとなるでしょう。

投稿2021/05/22 15:56

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jonathan_Sf

2021/05/23 06:09

ご回答ありがとうございました。 コードの文法的な誤りについてはご指摘通り解決できました。また、TLEについてもご指摘通りでした。 今まで計算量への意識は全くなく、勉強しなきゃなと意識する機会を頂きまして、感謝しております。 よろしければ下記のエントリにて、計算量についてご質問させていただきましたので、ご教示いただけましたら幸いです。この度はありがとうございました。 https://teratail.com/questions/339876
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問