🗂

プログラミング自主学習 DAY81 CodingTest

2023/08/16に公開

縦読み

<問題説明>
文字列 my_string と整数 m、c が与えられた場合、my_stringを一列に m 文字ずつ横に並べたとき、左から c 番目の列にある文字を文字列として返す solution 関数を作成してください。

<制限事項>
my_string は小文字のアルファベットで構成されています。
1 ≤ m ≤ my_stringの長さ ≤ 1,000
mはmy_stringの長さの約数のみが与えられます。
1 ≤ c ≤ m

<入出力例>

my_string m c result
"ihrhbakrfpndopljhygc" 4 2 "happy"
"programmers" 1 1 "programmers"

<入出力例の説明>

入出力例 #1
例題1のmy_stringを1行に4文字ずつ書くと、次のようになります。

1列目 2列目 3列目 4列目
i h r h
b a k r
f p n d
o p l j
h y g c

2列目に書かれた文字を縦に読むと、happyとなるため、"happy"を返します。

入出力例 #2
例題2のmy_stringは、mが1であるため、縦に"programmers"を書くことと同じです。したがって、1列目に書かれた文字を縦に読むと、programmersになります。したがって、"programmers"を返します。

感想

正直、問題を理解するに結構苦戦しました。
問題を繰り返しながら読むたびに思い浮か浮かべたの言葉は「これは韓国語ですか?」でした。

my_stringは1次元のchar[]配列であるため、最初は問題のm,cを活用してchar[][] 配列を生成し、my_stringの値を初期化されていなchar[][]に入れようと思いましたが、とても効率が悪く厄介でした。

まず、次元が値がうため、二重for文も難しい状況で、count=0という変数を宣言し、初期化しました。

class Solution {
    int count = 0;

しかし、二重for文はとても効率が悪いため、考えに考えた結果、配列を作らずに、for文だけで答えを得る方法が思いつきました。
for文の初期式、条件式、増減式を活用することでした。めったに増減式は触らないタイプですが、効率のために以下のようにコードを作成し、問題を解決しました。

class Solution {
    int count = 0;
    
    public String solution(String my_string, int m, int c) {
        
       StringBuilder sb = new StringBuilder();
        
       for(int i=c-1 ; i<my_string.length(); i+=m){
           sb.append(my_string.charAt(i));
       }
        
        
        return sb.toString();
    }
}

ps

int count = 0;を消すの忘れました、、、
Embedded Systemの会社だったら絶対叱られたと思います。(笑)

Discussion